每日一题 最大升序子数组和

88 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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 <= 100
  • 1 <= 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
};

image.png