leetcode:53. Maximum Subarray

来源:互联网 发布:淘宝店铺修改店名 编辑:程序博客网 时间:2024/06/05 05:29

描述

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.

思路

思路一:最为简单的暴力破解法
思路二:遍历,每一次和小于0重新求和

代码

思路一:

class Solution {public:    int maxSubArray(vector<int>& nums) {        if(nums.empty()) return 0;        int numsSize = nums.size();        int maxSum = nums[0];        int sumBuf = 0;        for(int i = 0; i < numsSize; i++){            for(int j = i; j < numsSize; j++){                sumBuf += nums[j];                maxSum = sumBuf>maxSum?sumBuf:maxSum;            }            sumBuf = 0;        }        return maxSum;    }};

思路二:

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

结果

这里写图片描述

他山之玉

C++ O(n) solutioin

class Solution {public:     int maxSubArray(vector<int>& nums) {        int n = nums.size();        return maxSub(nums, 0, n - 1);    }private:    int maxSub(vector<int>& nums, int l, int r) {        if (l > r) return INT_MIN;        int m = l + ((r - l) >> 1);        int lm = maxSub(nums, l, m - 1); // left half        int rm = maxSub(nums, m + 1, r); // right half        int i, sum, ml = 0, mr = 0;        // Move leftwards        for (i = m - 1, sum = 0; i >= l; i--) {            sum += nums[i];            ml = max(sum, ml);        }        // Move rightwards        for (i = m + 1, sum = 0; i <= r; i++) {            sum += nums[i];            mr = max(sum, mr);        }        return max(ml + mr + nums[m], max(lm, rm));    }};

分治法的思路

Java O(n) solution

public static int maxSubArray(int[] A) {    int maxSoFar=A[0], maxEndingHere=A[0];    for (int i=1;i<A.length;++i){        maxEndingHere= Math.max(maxEndingHere+A[i],A[i]);        maxSoFar=Math.max(maxSoFar, maxEndingHere);     }    return maxSoFar;}

python O(n) solution

def maxSubArray(self, nums):    T = nums[0]    maxsub = T    for i in nums[1:]:        T += i        if i > T:            T = i        if T > maxsub:            maxsub = T    return maxsub
0 0
原创粉丝点击