LeetCode 53最大子序和

给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

思路

暴力扫描 不谈 。
还有两种写法,写出的代码一样,但思路不一样。
第一种扫描法师我看的别人的blog上的,不太理解。写一下第二种 动态规划。
设 一个一维数组sum[] ,其中第i个元素表示从0到i的最大子序和,这样
s u m [ i + 1 ] = M a t h . m a x ( s u m [ i ] , s u m [ i ] + n u m s [ i ] ) sum[i+1]=Math.max(sum[i],sum[i]+nums[i]) sum[i+1]=Math.max(sum[i],sum[i]+nums[i])
sum[i+1]的递推公式如上。因为我们只需要最后的sum[n]且sum[i]只和sum[i-1]有关,因此不需要保存整个sum数组,只需要保存sum[i]和sum[i-1]即可。

代码

  public int maxSubArray2(int[] nums) {
        int sum = nums[0];
        int sumPre = nums[0];
        for (int i : nums) {
            if (sumPre > 0)
                sumPre += i;
            else
                sumPre = i;
            sum = sum > sumPre ? sum : sumPre;
        }
        return sum;
    }

你可能感兴趣的:(LeetCode每日一题)