1. 程式人生 > >【LeetCode】053. Maximum Subarray

【LeetCode】053. Maximum Subarray

子序列 fin n) cto largest nbsp code ray ive

題目:

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.

題解:

  由於是連續子序列這個限制,所以如果k+1這個元素之前的和是小於0的,那麽對於增大k+1這個元素從而去組成最大子序列是沒有貢獻的,所以可以把sum置0處理。

本質上是DP問題。,只是要先求出sum。

Solution 1 ()

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int res = INT_MIN, sum = 0;
        for (int n : nums) {
        /*  if(sum < 0) sum = 0; 
            sum += A[i];
            res = max(res, sum); */
            sum = max(sum + n, n);
            res 
= max(res, sum); } return cur; } };

Solution 2 (TLE)

class Solution {
public:
    int helper(vector<int> nums, int left, int right) {
        if(left >= right) return nums[left];
        int mid = left + (right - left)/2;
        int lmax = helper(nums, left, mid-1);
        
int rmax = helper(nums, mid+1, right); int mmax = nums[mid], tmp = mmax; for(int i=mid-1; i>=left; --i) { tmp += nums[i]; mmax = max(tmp, mmax); } tmp = mmax; for(int i=mid+1; i<=right; ++i) { tmp += nums[i]; mmax = max(tmp, mmax); } return max(mmax, max(lmax, rmax)); } int maxSubArray(vector<int>& nums) { if(nums.size() == 0) return 0; return helper(nums,0, nums.size()-1); } };

【LeetCode】053. Maximum Subarray