持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第10天,点击查看活动详情
1800. 最大升序子数组和
题目
原题链接: leetcode.cn/problems/su…
示例 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
提示:
1 <= nums.length <= 1001 <= nums[i] <= 100
解题思路
根据题目描述,我们需要找到nums数组中的升序子数组中最大的元素和。那我们其实只需要在遍历数组元素的过程中,对于nums[i - 1] < nums[i]的情况执行加和计算(当前total)然后根据情况判断即可。
步骤一
- 设置我们需要的变量
- subTotal:设置当前遍历的子数组的计算结果
- total:最终结果
var maxAscendingSum = function(nums) {
// 当前子数组的集合值
let subTotal = nums[0]
// 最终结果
let total = nums[0]
};
步骤二
我们需要遍历传入的num数组,在遍历的过程中我们需要进行如下判断:
if(nums[i - 1] < nums[i]):- 表明当前子数组为升序数组
- subTotal += nums[i](表明现在还是在升序子数组中)
if(nums[i - 1] > nums[i]):- 表明当前子数组为新的升序数组
- subTotal = num[i](表明当前已经进入新的子数组里面)
- 最后:
- total = Math.max(subTotal,total)
...省略
for(let i = 1; i< nums.length; i++){
// 表示当前子数组为升序
if(nums[i] > nums[i - 1]){
subTotal += nums[i]
}else{
subTotal = nums[i]
}
total = Math.max(total, subTotal)
}
...省略
步骤三
以上的讨论是建立在 num.length === 2 的情况,我们还需要考虑边界条件,即 num.length === 1 的情况:此时 num[0] 前面没有元素,本身可以构成一个长度为 1 的子数组,即:if(nums.length === 1) return nums[0]
完整代码
var maxAscendingSum = function(nums) {
if(nums.length === 1){
return nums[0]
}
// 当前子数组的集合值
let subTotal = nums[0]
// 最终结果
let total = nums[0]
for(let i = 1; i< nums.length; i++){
// 表示当前子数组为升序
if(nums[i] > nums[i - 1]){
subTotal += nums[i]
}else{
subTotal = nums[i]
}
total = Math.max(total, subTotal)
}
return total
};