持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第9天,点击查看活动详情
题目
给你一个正整数组成的数组 nums ,返回 nums 中一个 升序 子数组的最大可能元素和。
子数组是数组中的一个连续数字序列。
已知子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,若对所有 i(l <= i < r),numsi < numsi+1 都成立,则称这一子数组为 升序 子数组。注意,大小为 1 的子数组也视作 升序 子数组。
解题思路
数组中递增数组是一段段,因此可以先累加当前递增数组和并记录下来。等到遍历数组时数值比前面的小说明是分段递增数组了。重新开始求分段递增数组和并和当前记录的最大和比较得出最大值。
普通解法
- 特殊情况判断,数组个数判断
- 当前最大值max和目前比较后的最大和resultMax
- 遍历所有数值,是否是一个递增数组判断的依据下一个值是否大于上一个值
- 若不再是一个数组做最大值判断得到当前最大和resultMax
public int maxAscendingSum(int[] nums) {
if(nums.length == 1) return nums[0]; // 数组长度不够特殊情况处理
int max = nums[0]; // 计算中递增排序最大值
int resultMax = nums[0]; // 目前数组中求得最大值
for(int i = 1; i < nums.length;i++){ // 循环数组
if(nums[i] > nums[i - 1]){ // 判断下一个值是否大于前一个值
max += nums[i];
}else{
resultMax = Math.max(resultMax,max); // 不大于前一个值就需要判断下是否是最大和
max = nums[i]; // 记录下最大和
}
}
// 递增排序最大值最后一次求最大
resultMax = Math.max(resultMax,max);
return resultMax;
}
简化解法
优化解法主要是将最大值比较放在每次循环当中,在循环过程可能就存在循环到当前值比之前和要大的情况,和普通解法相比无需在循环结束之后再做一次比较操作。虽然每次循环都做比较但代码可读性会有所提高。
public int maxAscendingSum(int[] nums) {
int n = nums.length, ans = nums[0];
for (int i = 1, cur = nums[0]; i < n; i++) {
if (nums[i] > nums[i - 1]){
cur += nums[i];
}else{
cur = nums[i];
}
ans = Math.max(ans, cur); // 每次循环都求最大值
}
return ans;
}