2789. 合并后数组中的最大元素 - 力扣(LeetCode)
思路:
贪心,最终的和最大,肯定要加入尽可能多的数字。
两个数字一旦合并,新的数字就会变大,如果前面的数字合并,可能会比后面的数字更大了,就不能与后面的数字继续合并了,结果肯定不是最大的。所以从后向前加,小的数字会变大,这样就有可能把前面的数字合并起来,大的数字会变的更大,更有可能把前面的数字合并起来。最终会把最多的数字合并进来,结果最大。
总结:
和最大---->加入的数字最多---->满足题目条件的最多---->从后向前加,小的变大,大的更大,这样可以加入最多的数字,结果最大。
代码:
class Solution {
public long maxArrayValue(int[] nums) {
int n = nums.length;
if(n == 1) return nums[0];
// 两个指针迭代
// p1 指向遍历的前一个数
long p1 = nums[n - 2];
// p2 指向后一个数
long p2 = nums[n - 1];
for(int i = n - 3; i >= 0; i--) {
// 如果后面的一个数比前一个数更大,就把后一个数合并到前一个数
// 否则前一个数不变
if(p2 >= p1) {
p1 += p2;
}
// 迭代
// p2指向前一个数
p2 = p1;
// p1 继续向前遍历
p1 = nums[i];
}
// 最终剩两个数,如果后一个比前一个大,就返回合并的结果,否则返回前一个数
return p2 >= p1 ? p1 + p2 : p1;
}
}