LeetCode53:Maximum Subarray

来源:互联网 发布:sql union 去重复 编辑:程序博客网 时间:2024/05/22 08:01

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.

一:动态规划的解法

初始状态A[i]表示以小标i结尾的子数组的最大和和,

那么A[i+1]=max{A[i],0}+nums[i]

输出结果为max{A[i]}。

时间复杂度是O(n),空间复杂度是O(1)。

runtime:12ms。

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

二:分治法

这道题还可以使用分治法来求解。
分治法的说明如下图:

时间复杂度是o(nlogn),空间复杂度是o(1)。
runtime:16ms
class Solution {public:    int maxSubArray(vector<int>& nums) {                return divide(nums,0,nums.size()-1);    }        int divide(vector<int> & nums,int left,int right)    {        if(left==right)            return nums[left];        if(left>right)            return numeric_limits<int>::min();        int mid=left+(right-left)/2;        int sum=0;        int leftMax=0;        for(int i=mid-1;i>=left;i--)        {            sum+=nums[i];            leftMax=max(leftMax,sum);        }        sum=0;        int rightMax=0;        for(int i=mid+1;i<=right;i++)        {            sum+=nums[i];            rightMax=max(rightMax,sum);        }        int tmp=leftMax+rightMax+nums[mid];        return max(tmp,max(divide(nums,left,mid-1),divide(nums,mid+1,right)));    }};




0 0