剑指Offer打卡42.连续子数组的最大和

Posted 余光、

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指Offer打卡42.连续子数组的最大和相关的知识,希望对你有一定的参考价值。

剑指 Offer 42.连续子数组的最大和

JavaScript剑指Offer题解

🚀包含数组、对象、链表、堆栈、树等经典题型
☕️每天一道,轻松不累
💬详细的题目解析,收藏方便阅读
🙏在线star地址

在线阅读地址

在线阅读地址

题目描述

输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。

要求时间复杂度为O(n)。

示例1:

输入: nums = [-2,1,-3,4,-1,2,1,-5,4]
输出: 6
解释:连续子数组[4,-1,2,1] 的和最大,6。

题解一:动态规划

  • 时间复杂度O(n)
  • 空间复杂度O(1)

思路:

核心思想:nums[i] = max(nums[i],nums[i-1] + nums[i])

最大连续子数组和的,可以通过动态规划来处理,一次保存之前处理的结果,方便下一个动作处理。

因为我们只考虑下一个值与当前和之前的关系,所以可以利用参数数组本身,将空间复杂度降到O(1)。

  • 起始状态,i = 0; 连续元素和:nums[i - 1];
  • 动作:i >= 1 时 =>
    • 当前值:nums[i]
    • 连续元素和:nums[i - 1]
    • 判断:Max(nums[i] + nums[i - 1], nums[i - 1])
  • 保存
const maxSubArray = function(nums) 
    if (!nums.length) 
        return false;
    
    let i = 1;
    while (i < nums.length) 
        const pre = nums[i - 1];
        let cur = pre + nums[i];
        if (cur > nums[i]) 
            nums[i] = cur;
         else 
            nums[i] = nums[i];
        
        i++;
    
    return Math.max(...nums);
;

优化

/**
 * @param number[] nums
 * @return number
 */
var maxSubArray = function(nums) 
    let res = nums[0];
    for(let i = 1; i < nums.length ; i++)
        nums[i] = Math.max(nums[i],nums[i-1]+nums[i]);
        res = Math.max(res ,nums[i])
    
    return res;
;

写在最后

本篇是剑指Offer的第23题,俗话说好的合理的数据结构+算法才是写好代码的关键,不妨跟我一起来吧~

热门开源项目

以上是关于剑指Offer打卡42.连续子数组的最大和的主要内容,如果未能解决你的问题,请参考以下文章

剑指Offer打卡16. 数值的整数次方

剑指Offer打卡16. 数值的整数次方

剑指Offer打卡16. 数值的整数次方

剑指 Offer 42. 连续子数组的最大和

剑指 Offer 42. 连续子数组的最大和

leetcode-剑指 Offer 42连续子数组的最大和