Leetcode每日一题复盘:53.最大子序和
1.题目情景
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
首先从题干里提取输入与输出,可得传入函数的参数为数组nums,需要返回的是一个求和的整数值
给定的输入输出如下:
输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
2.本题利用的性质
本题是一道线性规划题,考察的主要是对数组子序列的提取。而如何在对数组进行子序列进行不重不漏的提取是非常关键的操作
此处需要介绍的方法是:从前至后遍历数组,每遍历一个元素就找到所有以它结尾的子串
3.我的做题历程
这题卡了我一晚上……【太菜是这样的】结果没想到看了半天大佬们的思路依然没看懂……【你是有多菜!】
最后终于搞明白了!先附上代码!(javascript beats 99.12%)
/**
* @param {number[]} nums
* @return {number}
*/
var maxSubArray = function(nums) {
if(nums.length==0){
return 0;
}
let maxA=nums[0];
let maxB=nums[0];
for(var i=1;i<nums.length;i++){
maxA=Math.max(nums[i],maxA+nums[i]);
maxB=Math.max(maxB,maxA);
}
return maxB;
};
4.动态规划
此处在做题过程中会产生两个最大值,分别记为maxA和maxB,其中maxA用来确定,以当前遍历到的位置为结尾的子串的中求和最大值。
只要每一次都能获取到以当前遍历到的位置为结尾的子串的中求和最大值,当指针移到下一个元素的时候,对下一个元素直接相加就能获得下一个加和最大值。
但是此时会出现一种情况,那就是若之前的最大值一直是负数,而下一个遍历到的值是正数,则此时求和最大值应为当前值。(不然加上之前的最大值反而会使整个子串加和变少)
这里要注意:会影响子串取值的,是以前一个元素结尾的子串最大值的正负,而非当前遍历到的值的正负。
而遍历过程中用maxB来记录这个过程的求和最大值,最后输出的也是maxB的值。