码迷,mamicode.com
首页 > 其他好文 > 详细

LeetCode53:Maximum Subarray

时间:2015-06-23 11:55:55      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:

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)));
    }
};




LeetCode53:Maximum Subarray

标签:

原文地址:http://blog.csdn.net/u012501459/article/details/46602961

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!