剑指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.连续子数组的最大和的主要内容,如果未能解决你的问题,请参考以下文章