本文主要解析力扣第53题的解法,本体较为基础,但思路很巧妙。
var maxSubArray = function(nums) {
//首先将两种特殊的情况排除掉再进行最大子序的计算
if(nums.length === 0){
return 0
}
else if(nums.length === 1){
return nums[0]
}
else{
//进行正题后,首先我们创建一个变量为和的结果addRes和一个初始化的max最大值。
let addRes = nums[0]
let max = nums[0]
for(let i = 1;i<nums.length;i++){
//进入循环后,我们可以发现addRes这个变量主要是用于对该元素与前一段子序列相加和自己本身进行大小比较,来判断是否要将前面的序列保留下来。
addRes = Math.max(nums[i]+addRes,nums[i])
//在前面对子序列进行准确的筛选后,我们就会产生一个max值,这个值就是对应的子序列最大值。
max = Math.max(addRes,max)
}
return max
}
};
重点语句解析: addRes = Math.max(nums[i]+addRes,nums[i])
这段代码主要是采用了如下的思路:
假设截取其中一段序列:[1.-1.2.4]。
那么当子序列为[1]时,nums[i]读到-1,此时的addRes如果把子序列加进去,肯定比单独-1一个元素本身的数值大,故这种情况保留子序列。
同理nums[i]读到4的时候,前面的子序列的和为2,加上4的话必定比单独一个4更大,故这种情况也需要保留子序列。