您的位置:首页 > 其它

Leetcode#53 Maximum Subarray

2015-07-20 00:48 357 查看
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
.

click to show more practice.

DIfficulty:Medium

非常经典的问题

解法一,用分治法做,复杂度较高,可AC

int gen(vector<int>& nums,int start,int en){
int temp = nums[start],sum = 0,temp1 = start;

if(start==en)
{
return nums[start];
}

if(start>en)
return -2147483648;
for(int i = start;i<=en;i++)
{
sum = sum + nums[i];
if(nums[i]<temp)
{
temp = nums[i];
temp1 = i;
}
}
int ans;
int leftMax = -2147483648, rightMax = -2147483648;
int sum1 = 0;
for (int i = temp1; i >= start; i--)
{
sum1 += nums[i];
if (sum1 > leftMax)
leftMax = sum1;
}
sum1 = 0;
for (int i = temp1+1; i <=en; i++)
{
sum1 += nums[i];
if (sum1 > rightMax)
rightMax = sum1;
}

if (leftMax < 0 || rightMax < 0)
sum1 = max(leftMax, rightMax);
else
sum1 = leftMax + rightMax;
ans = max(gen(nums,start,temp1-1),gen(nums,temp1+1,en));
ans = max(sum,ans);
ans = max(ans,sum1);
return ans;
}

int maxSubArray(vector<int>& nums) {
int len = nums.size();
int ans;
ans = gen(nums,0,len-1);
return ans;

}


解法二:DP作法,看了题解才理解,十分牛逼。
其中Sum表示之前的数组值之和,若这个值小于0的则说明对后面无贡献,因此清0.

int maxSubArray(vector<int>& nums) {
int len = nums.size();
int sum = nums[0] , maxSum = nums[0];
for(int i = 1; i < len; i++){
if(sum < 0) sum = 0;
sum += nums[i];
maxSum = max(maxSum, sum);
}
return maxSum;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: