leetcode第53题:最大子数组和

638 阅读1分钟

题目

给你一个整数数组 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,就不相加,就相当于重新开始个子数组了。 这样就保证了当前最大
  • 最后我们每次把相加结果存储到一个数组中,然后最后返回这个数组中最大的,就是最大子数组和
    微信图片_20220402223257.jpg
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
};