您的位置:首页 > 其它

LeetCode学习篇二十七——Maximum Subarray

2016-12-05 14:22 260 查看
题目: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.

难度:medium

解法一:动态规划(遍历数组全局最优和局部最优)

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


解法二:二分法

最大和子序列不是在左边的子序列,就是右边的子序列,或者中间的子序列

class Solution {
public:
int maxSum(vector<int> & nums, int l, int r) {
if (l == r) return nums[l];
int mid = (l + r) / 2;
int maxLeft = maxSum(nums, l, mid);
int maxRight = maxSum(nums, mid + 1, r);

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