开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第 天,点击查看活动详情
题目、1800. 最大升序子数组和
原题链接:1800. 最大升序子数组和
题目描述:
给你一个正整数组成的数组 nums ,返回 nums 中一个 升序 子数组的最大可能元素和。
子数组是数组中的一个连续数字序列。
已知子数组 [numsl, numsl+1, ..., numsr-1, numsr] ,若对所有 i(l <= i < r),numsi < numsi+1 都成>立,则称这一子数组为 升序 子数组。注意,大小为 1 的子数组也视作 升序 子数组。
/
示例 1:
输入:nums = [10,20,30,5,10,50]
输出:65
解释:[5,10,50] 是元素和最大的升序子数组,最大元素和为 65 。
/
示例 2:
输入:nums = [10,20,30,40,50]
输出:150
解释:[10,20,30,40,50] 是元素和最大的升序子数组,最大元素和为 150 。
/
示例 3:
输入:nums = [12,17,15,13,10,11,12]
输出:33
解释:[10,11,12] 是元素和最大的升序子数组,最大元素和为 33 。
/
示例 4:
输入:nums = [100,10,1]
输出:100
解题思路:
题目要求我i们获取到,数组所有升序序列中,最大的元素和。
那么我们可以通过遍历数组来实现,一边遍历数组,一边记录元素和,当检测到下一个元素值小于或等于当前元素,也就代表两者无法构成升序数组,我们将最大元素和记录下来,然后将元素和清零,重复操作。
当遍历完整个数组,我们也遍历完了所有升序序列的元素和,自然可以得到其中的最大元素和并返回....
提交代码:
class Solution {
public int maxAscendingSum(int[] nums) {
int curr = 0; //表示当前元素和
int max = 0; //表示最大元素和
int n = nums.length - 1; //数组最后一个元素的下标
for(int i = 0;i < n;++i){ //遍历数组
curr += nums[i]; //数字累加
if(nums[i] >= nums[i+1]){ //若与下一个元素无法组成升序数组
max = Math.max(max,curr); //记录当前最大元素和
curr = 0; //元素和清零
}
}
//我们只遍历到了数组的倒数第二位:
//还需要在当前最大元素和 与 最后一个升序数组的元素和比较大小
return Math.max(max,curr + nums[n]);
}
}
提交结果: