LeetCode: Maximum Subarray

来源:互联网 发布:跟着龚琳娜学唱歌 淘宝 编辑:程序博客网 时间:2024/06/14 06:20

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.

class Solution {public:    int maxSubArray(int A[], int n) {        int max = INT_MIN, local = 0;        for(int i = 0; i < n; i++)        {            local = std::max(A[i], local+A[i]);            max = std::max(local, max);        }        return max;    }};


Round 2:

class Solution {public:    int maxSubArray(int A[], int n) {        if(n == 0 )            return 0;        int preMax = A[0], max = A[0];        for(int i = 1; i < n; i++)        {            int curMax = std::max(A[i], A[i]+preMax);            if(curMax > max)                max = curMax;            preMax = curMax;        }        return max;    }};

Divide and conquer:

class Solution {public:    int maxSubArray(int A[], int n) {        return mergeSort(0, n-1, A);    }private:    int mergeSort(int l, int r, int A[])    {        if(l == r)            return A[l];        int mid = (l+r)/2;        int lmax = mergeSort(l, mid, A);        int rmax = mergeSort(mid+1, r, A);        int midMaxL = 0;        int sum = 0;        for(int i = mid-1; i >= l; i--)        {            sum += A[i];            if(sum > midMaxL)                midMaxL = sum;        }        int midMaxR = 0;        sum = 0;        for(int i = mid+1; i <= r; i++)        {            sum += A[i];            if(sum > midMaxR)                midMaxR = sum;        }        return std::max(std::max(lmax, rmax), midMaxL+midMaxR+A[mid]);    }};


0 0