持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第11天,点击查看活动详情
上班的第一天,假期后遗症,只想摸鱼
最大升序子数组和
该题出自力扣的1800题 —— 最大升序子数组和【简单题】
审题
给你一个正整数组成的数组 nums ,返回 nums 中一个 升序 子数组的最大可能元素和。 子数组是数组中的一个连续数字序列。 已知子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,若对所有 i(l <= i < r),numsi < numsi+1 都成立,则称这一子数组为 升序 子数组。注意,大小为 1 的子数组也视作 升序 子数组。
- 该题就是给出一个整型数组,要求返回升序子数组的和,所谓的升序子数组,也就是连续的升序子数组。
- 先进行剪枝判断,如果长度为1的数组,直接返回首值
- 定义最大值为首位下标,构造一个变量存储上一下标对应值
- 遍历数组,判断当前下标是否比上一下标大,是否构成升序的条件
- 如果构成,则利用前缀和的数组,覆盖相加。如果当前元素是数组的第一个元素,或者当前元素大于前一个元素,那么将当前元素加入到当前升序子数组的和
- 如果不构成,则直接重置两个变量,取Max值的比较。当前元素不满足升序子数组的条件,那么将当前升序子数组的和
t重置为当前元素
- 当然了,题解也有大致相同的解法,动态规划,简单的dp,其实就是暴力解法的一种,直接遍历过去
编码
class Solution {
public int maxAscendingSum(int[] nums) {
int len = nums.length;
if (len == 1)return nums[0];
int max = nums[0],index = nums[0];
for (int i = 1; i < len; i++) {
if (nums[i] <= index){
max = Math.max(nums[i -1],max);
index = nums[i];
}else {
index = nums[i];
nums[i] += nums[i - 1];
}
}
max = Math.max(nums[len - 1],max);
return max;
}
}