题目
我的思路和代码 动态规划思想
用另一个数组res去记录累加和,比如,res[5]表示,前5个数字中从某一位置开始到第五个数字的累加和,某一位置可能是0、1、2、3,也可能刚从下标为4的第五个数字开始,要看从哪一数字开始是升序的
数组nums是由正整数组成的数组,所以只要考虑是否升序就行,如果包含负数的话,还需要进一步判断,res[i-1]+nums[i]和nums[i]的大小,昨天的LeetCode每日一题中用到了Arrays.stream(),今天拿来用用
import java.util.Arrays;
class Solution {
public int maxAscendingSum(int[] nums) {
int[] res = new int[nums.length];
res[0] = nums[0];
for (int i = 1; i < nums.length; i++) {
if (nums[i] > nums[i - 1]) {
res[i] = res[i - 1] + nums[i];
} else {
res[i] = nums[i];
}
}
return Arrays.stream(res).max().getAsInt();
}
}
他人思路 滑动窗口
- 是否可以用滑动窗口?
如果题目中求得是符合某个条件的连续的子序列的最优情况,则可以使用滑动窗口,注意:一定要是连续的子序列才可以用
- 窗口内部如何更新以此来求得最优解?
对于本题而言,是只求连续递增子序列的最大和,因此直接进行更新区间内部的和即可
- 窗口边界在什么情况下移动?
在本题中,对于右边界,不符合nums[right] > nums[right-1],直接更新即可,由于本题子序列具有单调性,无需进行左边界只移动一部分的操作,直接移动到不符合条件的即可
class Solution {
public int maxAscendingSum(int[] nums) {
//双指针
int right = 1, left = 0;
//记录数组的长度
int len = nums.length;
//记录当前窗口的累加和
int cur;
//记录最后要返回的最大的累加和
int res = nums[0];
while (left < len && right < len) {
cur = nums[left];
while (right < len && nums[right] > nums[right - 1]) {
cur += nums[right];
right++;
}
res = Math.max(res, cur);
//退出while循环时,表示当前的nums[right]不满足升序
//这时,left赋值为right,开始一个新的区间
left = right;
right = left + 1;
}
return res;
}
}