Description

Given an integer array nums, find the

subarray

with the largest sum, and return its sum.

Example 1:

Input: nums = [-2,1,-3,4,-1,2,1,-5,4] Output: 6 Explanation: The subarray [4,-1,2,1] has the largest sum 6.

Example 2:

Input: nums = [1] Output: 1 Explanation: The subarray [1] has the largest sum 1.

Example 3:

Input: nums = [5,4,-1,7,8] Output: 23 Explanation: The subarray [5,4,-1,7,8] has the largest sum 23.

Constraints:

  • 1 <= nums.length <= 105
  • -104 <= nums[i] <= 104

Follow up: If you have figured out the O(n) solution, try coding another solution using the divide and conquer approach, which is more subtle.

Code

Kadane’s Algorithm

使用 Best Time to Buy and Sell Stock 中學到的 Kadane’s Algorithm。

see Kadane Algorithm(Maximum Subarray Problem)

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int currMax = nums[0];
        int maxSoFar = nums[0];
        for(int i = 1; i < nums.size(); i++) {
            currMax = max(currMax + nums[i], nums[i]);
            maxSoFar = max(maxSoFar, currMax);
        }
 
        return maxSoFar;
 
    }
};

Divide and Conquer

time,

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        return helper(nums, 0, nums.size() - 1);
    }
 
    int helper(vector<int>& nums, int start, int end) {
        if(start > end) return INT_MIN;
        int mid = start + (end - start) / 2;
 
        int currSum = 0, leftSum = 0, rightSum = 0;
        for(int i = mid + 1; i <= end; i++) {
            currSum += nums[i];
            rightSum = max(rightSum, currSum);
        }
        currSum = 0;
        for(int i = mid - 1; i >= start; i--) {
            currSum += nums[i];
            leftSum = max(leftSum, currSum);
        }
 
        return max({helper(nums, start, mid - 1), helper(nums, mid + 1, end), nums[mid] + leftSum + rightSum});
 
    }
};

Source