53. Maximum Subarray

来源:互联网 发布:js style.color 编辑:程序博客网 时间:2024/06/06 10:45

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.
第一种方法:暴力求解,两重循环,时间复杂度O(N^2),超时了

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

第二种方法:分治递归法,时间复杂度O(NlogN)

class Solution {public:    int maxSubArray(vector<int>& nums)     {        int l=0,            r=nums.size()-1;        return DAC(nums,l,r);    }    int DAC(vector<int>& nums,int l,int r)    {        if(l==r)            return nums[l];        int mid=(l+r)/2;        int leftmax=DAC(nums,l,mid);        int rightmax=DAC(nums,mid+1,r);        int i;        int lmax=INT_MIN;        int leftsum=0;        for(i=mid;i>=l;i--)        {            leftsum+=nums[i];            lmax=leftsum>lmax?leftsum:lmax;        }        int rmax=INT_MIN;        int rightsum=0;        for(i=mid+1;i<=r;i++)        {            rightsum+=nums[i];            rmax=rightsum>rmax?rightsum:rmax;        }        return max(max(leftmax,rightmax),lmax+rmax);    }    int max(int a,int b)    {        return a>b?a:b;    }};

第三种方法:动态规划,时间复杂度O(N)
sum[i]=sum[i-1]+nums[i];
如果sum[i-1]<0 , sum[i]=nums[i];
如果sum[i-1]>0 , sum[i]=sum[i-1]+nums[i];

class Solution {public:    int maxSubArray(vector<int>& nums)     {        int i,sum,max;        max=INT_MIN;        sum=0;        for(i=0;i<nums.size();i++)        {            sum=sum+nums[i];            if(sum>max)                max=sum;            if(sum<0)                sum=0;        }        return max;    }};
class Solution {public:    int maxSubArray(vector<int>& nums)     {        int i,sum,max;        max=nums[0];        sum=0;        for(i=0;i<nums.size();i++)        {            if(sum>=0)                sum=sum+nums[i];            else                sum=nums[i];            if(sum>max)                max=sum;        }        return max;    }};
0 0
原创粉丝点击