力扣刷题之1014.最佳观光组合

题干描述

给你一个正整数数组 values,其中 values[i] 表示第 i 个观光景点的评分,并且两个景点 ij 之间的 距离j - i

一对景点(i < j)组成的观光组合的得分为 values[i] + values[j] + i - j ,也就是景点的评分之和减去它们两者之间的距离。

返回一对观光景点能取得的最高分。

示例 1:

复制代码
输入:values = [8,1,5,2,6]
输出:11
解释:i = 0, j = 2, values[i] + values[j] + i - j = 8 + 5 + 0 - 2 = 11

示例 2:

复制代码
输入:values = [1,2]
输出:2

题干分析

题干理解

给定一个正整数数组values,其中valuesi表示dii个观光景点的评分。两个景点i和j之间的距离为j-i。而一对景点组成的观光组合的得分计算公式为:score = valuesi + valuesj + i - j,也就是两个景点的评分之和减去它们之间的距离。本题的目标是找出一堆景点,使其得分最大,并返回这个最大得分。

解题思路

1.理解得分公式

已知原始的得分公式为:score = valuesi + valuesj + i - j,,将公式重新排列我们就得到了score = (valuesi + i) + (valuesj - j),此时该公式可以划分为两个部分:

  • (valuei + i):一个仅与i有关的值。
  • (valuej + j):一个仅与j有关的值。
2.算法选择
暴力解法(过于麻烦,不可取)
  • 枚举有有的(i,j)对,计算每个得分,时间复杂度为O(n^2),当大数组情况下效率低下。
线性解法(最后的选择)
  • 在遍历数组是,维护当前位置之前的valuesi + i的最大值。
  • 对于每个位置j(从第二个元素开始),计算当前得分
  • 当设立最大得分以及当前得分,当当前得分大于当前的最大得分时,最大得分进行相关的更新,同时更新max_i为当前的valuesj + j,如果它更大,以便于在后面的计算中使用。

代码展示

cpp 复制代码
int maxScoreSightseeingPair(int* values, int valuesSize){
    //1.初始化对打得分为0
    int max_score = 0;
    //2.初始化max_i为value[0] + 0,即第一个景点的评分加上其索引
    int max_i = values[0] + 0;
    //3.从第二个元素开始遍历数组
    for(int j = 0; j < valuesSize; j++){
        //计算当前的得分:之前的最大values[i] + i,加上当前values[j] - j
        int current_score = max_i + values[j] - j;
        //4.如果当前的得分大于当前的最大得分
        if(current_score > max_score){
          max_score = current_score;
        }
        //5.计算当前的values[j] + j,用于更新max_i
        int current_i = values[j] + j;
        //6.如果current_i大于max_i,更新max_i
        if(current_i > max_i){
          max_i = current_i;
        }
    }
    //7.返回最大得分
    return max_score;
}
相关推荐
先吃饱再说9 小时前
判断回文字符串,从一行代码到双指针优化
算法
黄敬峰12 小时前
深入理解算法核心:从递归思想、数组扁平化到快速排序
算法
得物技术13 小时前
从狂野代码到按目标生产:得物推荐 AI Harness 的工程化实践|AICon 演讲整理
人工智能·算法·架构
AI小老六17 小时前
SkillOpt 架构拆解:把 Skill 文本当参数,用执行轨迹训练 Agent
后端·算法·ai编程
胡萝卜术17 小时前
从“分数打架”到“排名投票”:为什么你的ChatBI必须用RRF?
算法·设计模式·面试
Asize18 小时前
初识DFS 与 BFS:递归、队列与图遍历
算法
罗西的思考1 天前
机器人 / 强化学习】HIL-SERL:人类在环驱动的具身智能进化框架
人工智能·算法·机器学习
CSharp精选营1 天前
关系型 vs 非关系型:从原理到选型,一文搞定数据库核心分类
数据结构·nosql·关系型数据库·非关系型数据库·技术选型
美团技术团队1 天前
LongCat 开源 VitaBench 2.0:长期动态智能体基准新标杆
人工智能·算法