题目
给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组 是数组中的一个连续部分。
示例 1:
输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。
示例 2:
输入:nums = [1]
输出:1
示例 3:
输入:nums = [5,4,-1,7,8]
输出:23
题解
动态规划
要算最大的子数组和,所以我们就可以遍历数组
- 然后每一项和前一次的相加结果相加
- 需要判断前一次的相加结果,如果前一次的相加结果小于0,相加后会使我们现在当前的数更加小,所以如果小于0,就不相加,就相当于重新开始个子数组了。 这样就保证了当前最大
- 最后我们每次把相加结果存储到一个数组中,然后最后返回这个数组中最大的,就是最大子数组和
var getMax=function(arr){
let max=arr[0];
for(let i=1;i<arr.length;i++){
if(arr[i]>max){
max=arr[i]
}
}
return max
}
var maxSubArray = function(nums) {
let pre =nums[0];
let i=1;
let result=[nums[0]];
while(i<nums.length){
if(pre<0){
pre=nums[i];
}else{
pre+=nums[i];
}
result.push(pre);
i++
}
return getMax(result)
};
优化点
- 因为现在要返回数组中最大值,所以单独写了个函数,空间浪费比较多
- 其实也不用存储到数组中,就每次的计算结果和最大的相比较,如果大于则替换,否则还是原来的
- 省去了去在一个数组里寻找最大数
var maxSubArray = function(nums) {
let pre =nums[0];
let i=1;
let result=nums[0];
while(i<nums.length){
pre=pre<0?nums[i++]:pre+nums[i++];
result=pre>result?pre:result;
}
return result
};