思路
相较于最大升序子序列而言更容易想到解法。
由此题意可知,我们可以将数组拆分成若干个部分,每个部分中元素都是递增的,而相邻的两个部分中,前一部分的最后一个元素是大于等于后一部分的第一个元素的。
因此,我们可以遍历数组元素,找到每个这样的切分点,计算前一部分的和,与答案进行比较即可。
需要维护两个值:
curSum
: 当前部分的元素和;ans
:最大升序子数组的和。
代码如下:
class Solution {
public int maxAscendingSum(int[] nums) {
int n = nums.length;
int ans = 0;
int curSum = 0;
for (int i = 0; i < n; i++) {
if (i == 0 || nums[i] <= nums[i-1]){
//下一块的起始点,更新ans
ans = Math.max(curSum, ans);
curSum = nums[i];
} else {
curSum += nums[i];
}
}
//退出循环后,仍需要更新一次ans
ans = Math.max(curSum, ans);
return ans;
}
}