Leetcode 53
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
- 动态规划
对第n个数来说,看前面对自己是否有积极影响
dp[i] = max{A[i], dp[i-1]+A[i]}
class Solution {
public:
int maxSubArray(vector<int>& nums) {
//动态规划
//sum是以i结尾的最大值
int sum = 0;
int res = INT_MIN;
for(int i=0;i<nums.size();i++)
{
sum+=nums[i];
if(sum>res)
res = sum;
if(sum<0) sum=0;
}
return res;
}
};
- 分治法
最大连续子序列和要么出现在数组左半部分,要么出现在数组右半部分,要么横跨左右两半部分。因此求出这三种情况下的最大值就可以得到最大连续子序列和。
class Solution {
public:
int maxSubArray(vector<int>& nums) {
//分治法
return rec(nums,0,nums.size()-1);
}
int rec(vector<int>& nums,int left,int right)
{
if(left>=right) return nums[left];
int m = (left+right)/2;
int lmax = rec(nums,left,m-1);
int rmax = rec(nums,m+1,right);
int mmax = nums[m];
int t = mmax;
for(int i=m-1;i>=0;i--)
{
t+=nums[i];
if (t>mmax) mmax = t;
}
t = mmax;
for(int i=m+1;i<=right;i++)
{
t+=nums[i];
if (t>mmax) mmax = t;
}
if(lmax<rmax) lmax = rmax;
return max(lmax,mmax);
}
};