前言
用通俗的话来分析各种算法题-----算法小白
算法题
小R正在研究一组观光景点,每个景点都有一个评分,保存在数组
values中,其中values[i]表示第i个观光景点的评分。同时,景点之间的距离由它们的下标差j - i表示。一对景点
(i < j)的观光组合得分为values[i] + values[j] + i - j,也就是两者评分之和减去它们之间的距离。小R想知道,在哪种情况下能够获得观光景点组合的最高得分。
约束条件:
- 2 <=
values.length - 1 <=
values[i]<= 1000
通俗分析(简称说人话)
这道题,到底是干啥的呢?
就是咱们出去旅游,比如说有五个景点,但时间有限,只能从中选评分高的,相对距离还比较近的两个景点去玩。
就是在有限的时间玩好。
那我们一开始对这些五个景点都不了解,就简单随便选一个,默认他为第一个,就是values[0],然后 一个一个地再去比较和分析。
怎么比较呢?人家题目是有规则的:一对景点(i<j)
values[i] + values[j] + i - j
这个得分最大,就是最优的组合方案。
一开始 那就是 选 五个景点中的第一个 max_i_plus_value= values[0] + 0 默认的为最大, 然后遍历比较 values[j]-j
那就是当前值 current_score = values[0] + values[j]-j 要最大的。
我们有了当前值后,是跟 谁比 是最大的呢? 咱们这可以设置一个 max_score 变量 ,存放每次比较完的最大值。
好了,以上是我自己的理解,有不对的地方,欢迎批评指教。再一起看看官方的解题思路。
解题思路
-
理解问题:
- 我们需要找到一对景点
(i, j),其中i < j,使得values[i] + values[j] + i - j最大。 - 这个表达式可以分解为
(values[i] + i) + (values[j] - j)。
- 我们需要找到一对景点
-
优化思路:
- 对于每个
j,我们只需要找到i < j使得values[i] + i最大。 - 因此,我们可以维护一个变量
max_i_plus_value,表示在j之前的所有i中,values[i] + i的最大值。
- 对于每个
-
算法步骤:
-
初始化
max_score为Integer.MIN_VALUE。 -
初始化
max_i_plus_value为values[0] + 0。 -
遍历数组
values,对于每个j:- 计算当前的得分
current_score = max_i_plus_value + values[j] - j。 - 更新
max_score如果current_score更大。 - 更新
max_i_plus_value为Math.max(max_i_plus_value, values[j] + j)。
- 计算当前的得分
-
返回
max_score
-
代码
// 初始化最大得分
int max_score = Integer.MIN_VALUE;
// 初始化最大 i + values[i]
int max_i_plus_value = values[0];
// 遍历数组
for (int j = 1; j < values.length; j++) {
// 计算当前得分
int current_score = max_i_plus_value + values[j] - j;
// 更新最大得分
max_score = Math.max(max_score, current_score);
// 更新 max_i_plus_value
max_i_plus_value = Math.max(max_i_plus_value, values[j] + j);
}
return max_score;
最后
想说说题外话,好像程序里面 最最核心的就是算法,离了算法,程序就少了精气神,希望自己可以坚持下去,把这五百道题都写写自己的想法,也十分感谢MarsCode AI 的帮助,真的事半功倍!