1. 程式人生 > >leetcode53- Maximum Subarray- easy

leetcode53- Maximum Subarray- easy

負數 return ray lee ast 一個 num imu 轉變

Find the contiguous subarray within an array (containing at least one number) which has the largest sum.

For example, given the array [-2,1,-3,4,-1,2,1,-5,4],
the contiguous subarray [4,-1,2,1] has the largest sum = 6.

1.前綴法。第一個優化是把連續和轉變為sum[j] - sum[i]的值。第二個優化是引入前綴,一直記錄前i個數裏最小的sum[i],那你每次算i~j和的時候肯定是要減去這個最小前綴才能讓差值最大化的。

2.貪婪法。每次如果發現當前的sum變成負數了就立即舍去,下一個數加進來的時候肯定選擇不要前面這串累贅的。

1.前綴法實現

class Solution {
    public int maxSubArray(int[] nums) {
        
        if (nums == null || nums.length == 0) {
            return 0;
        }
        
        int[] sums = new int[nums.length + 1];
        sums[0] = 0;
        for (int
i = 0; i < nums.length; i++) { sums[i + 1] = sums[i] + nums[i]; } int minPreSum = sums[0]; int maxSum = Integer.MIN_VALUE; for (int i = 1; i < sums.length; i++) { int crtSum = sums[i] - minPreSum; maxSum = Math.max(maxSum, crtSum); minPreSum
= Math.min(minPreSum, sums[i]); } return maxSum; } }

2.貪心法實現

class Solution {
    public int maxSubArray(int[] nums) {
        
        if (nums == null || nums.length == 0) {
            return 0;
        }
        
        int maxSum = Integer.MIN_VALUE;
        int localSum = 0;
        for (int i = 0; i < nums.length; i++) {
            localSum += nums[i];
            maxSum = Math.max(maxSum, localSum);
            localSum = Math.max(localSum, 0);
        }
        
        return maxSum;
    }
}

leetcode53- Maximum Subarray- easy