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.

click to show more practice.

More practice:

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

asked 21 Mar '12, 13:47

1337c0d3r's gravatar image

1337c0d3r ♦♦
1.2k582171
accept rate: 2%

What do you mean by "using the divide and conquer approach"? Split the array into two and find the largest sum in subarrays?

(07 Apr, 16:57) n00tc0d3r n00tc0d3r's gravatar image

12next »

class Solution {
public:
    int maxSubArray(int A[], int n) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        int ret = A[0], sum = 0;
        for (int i = 0; i < n; ++i) {
            sum = max(sum + A[i], A[i]);
            ret = max(ret, sum);
        }
        return ret;
    }
};
link

answered 22 Jan, 08:26

Linfuzki's gravatar image

Linfuzki
53856
accept rate: 0%

edited 22 Jan, 08:28

divide and conquer approach

int maxSubArray(int A[], int n) {
    return maxSub(A,0,n-1);
}
int maxSub(int A[], int left, int right){
    if(left>right)return INT_MIN;
    if(left==right)return A[left];
    int mid=left+((right-left)>>1);
    int leftMax=INT_MIN, rightMax=INT_MIN;
    for(int i=mid-1, currSum=0; i>=left; --i)
        currSum+=A[i], leftMax=max(leftMax, currSum);
    for(int i=mid+1, currSum=0; i<=right; ++i)
        currSum+=A[i], rightMax=max(rightMax, currSum);
    int midMax=A[mid]+max(leftMax,0)+max(rightMax,0);
    return max(max(maxSub(A,left,mid-1),maxSub(A,mid+1,right)),midMax);
}
link

answered 19 Sep, 18:35

c0mm3t's gravatar image

c0mm3t
414
accept rate: 0%

public int maxSubArray(int[] A) {
    int maxnow = 0;
    int maxall = A[0];
    for (int i = 0; i < A.length; i++) {
        maxnow = Math.max(0, maxnow + A[i]);
        if (maxnow > 0)
            maxall = Math.max(maxall, maxnow);
        else
            maxall = Math.max(maxall, A[i]);
    }
    return maxall;
}
link

answered 07 Jan, 12:28

solowolf21's gravatar image

solowolf21
112
accept rate: 0%

edited 13 Jan, 20:18

1337c0d3r's gravatar image

1337c0d3r ♦♦
1.2k582171

class Solution {
public:
int maxSubArray(int A[], int n) {
    // Start typing your C/C++ solution below
    // DO NOT write int main() function
    if (n == 0) return INT_MIN;
    if (n==1) return A[0];
    int max_so_far = A[0];
    int max_end_here = A[0];
    for (int i=1;i<n;i++)
    {
        if (max_end_here <0)
            max_end_here = A[i];
        else
            max_end_here += A[i];
        max_so_far = max(max_so_far, max_end_here);
    }
    return max_so_far;
}
};
link

answered 13 Jan, 19:53

roger's gravatar image

roger
664
accept rate: 0%

    int max = 1 << 31;
    int sum_for_now = 0;
    for( int i=0;i<n;i++)
    {
        sum_for_now += A[i];
        if( sum_for_now > max)
            max = sum_for_now;
        if( sum_for_now < 0)
            sum_for_now = 0;
    }
    return max;
link

answered 14 Jan, 06:17

spooky's gravatar image

spooky
124
accept rate: 0%

int maxSubArray(int A[], int n) {
    // Start typing your C/C++ solution below
    // DO NOT write int main() function
    if (n==0) return 0;
    int sum = 0;
    int max = -1 * INT_MAX;

    for (int i=0; i<n; i++) {

        sum += A[i];
        if (sum > max) max = sum;
        if (sum < 0) sum = 0;
    }
    return max;
}
link

answered 14 Mar, 08:16

Shengzhe%20Chen's gravatar image

Shengzhe Chen
1124
accept rate: 4%

int maxSubArray(int A[], int n) {
    // Start typing your C/C++ solution below
    // DO NOT write int main() function
    int local_max = 0, max = INT_MIN;

    for (int i = 0; i < n; i++) {
        local_max += A[i];
        if (local_max > max) {
            max = local_max;
        }
        if (local_max < 0) {
            local_max = 0;
        }
    }

    return max;
}
link

answered 12 Apr, 00:13

whitebluff's gravatar image

whitebluff
212
accept rate: 0%

public class Solution {
public int maxSubArray(int[] A) {
    // Start typing your Java solution below
    // DO NOT write main() function
    int max = A[0];
    int sum = A[0];
    for(int i = 1; i < A.length; i++){
        sum = Math.max(A[i],sum+A[i]);
        max = Math.max(max,sum);
    }
    return max;
}

}

link

answered 20 Aug, 06:55

soloviola's gravatar image

soloviola
112
accept rate: 0%

public class Solution {
public int maxSubArray(int[] A) {
    // Start typing your Java solution below
    // DO NOT write main() function
    int Max = A[0];
    int subMax = A[0];

    for(int i=1; i < A.length; i++){
        subMax = Math.max(A[i], A[i]+subMax);
        Max = Math.max(subMax, Max);
    }

    return Max;

}
}
link

answered 24 Aug, 23:27

plmm's gravatar image

plmm
11
accept rate: 0%

int maxSubArray(int A[], int n) {
    int maxSum=INT_MIN, currSum=0;
    for(int i=0;i<n;++i)
        maxSum=max(maxSum,currSum=max(currSum+A[i],A[i]));
    return maxSum;
}

every max substring ending at A[i] is the maximum of A[i] and (max substring ending at A[i-1]) + A[i]

link

answered 19 Sep, 17:32

c0mm3t's gravatar image

c0mm3t
414
accept rate: 0%

edited 19 Sep, 17:34

Your answer
toggle preview

Follow this question

By Email:

Once you sign in you will be able to subscribe for any updates here

By RSS:

Answers

Answers and Comments

Markdown Basics

  • *italic* or _italic_
  • **bold** or __bold__
  • Indent code by 4 spaces.
  • link:[text](http://url.com/ "Title")
  • image?![alt text](/path/img.jpg "Title")
  • numbered list: 1. Foo 2. Bar
  • to add a line break simply add two spaces to where you would like the new line to be.
  • basic HTML tags are also supported

Tags:

×139

Asked: 21 Mar '12, 13:47

Seen: 2,194 times

Last updated: 27 Sep, 10:15