- leetcode-53-最大子序和
题型:动态规划、
难度:简单
题目:给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
代码:
(1)方法一:动态规划
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int len = nums.size();
if(len == 0) return 0;
int res = nums[0];
vector<int> dp(len,0);
dp[0] = res;
for(int i=1;i<len;i++)
{
dp[i] = max(dp[i-1]+nums[i],nums[i]);
res = max(dp[i],res);
}
return res;
}
};
(2)分治法:
class Solution {
//找出中间两个点n1,n2,分三种情况:
//1.n1之前,一定不包含n2
//2.n2之后,一定不包含n1
//3.一定包含n1和n2
public:
int maxBoth(vector<int> &nums,int left,int mid,int right){
int temp = 0;
int leftsum = INT_MIN;
//因为mid位置的元素一定存在,分别找前面和后面连续的最大和,相加即可
for(int i=mid;i>=left;i--)
{
temp += nums[i];
if(temp > leftsum)
leftsum = temp;
}
temp = 0;
//找右半部分
int rightsum = INT_MIN;
for(int i=mid+1;i<=right;i++)
{
temp += nums[i];
if(temp > rightsum)
rightsum = temp;
}
return leftsum+rightsum;
}
int maxHalf(vector<int> &nums,int left,int right){
if(left == right) return nums[left];
int mid = left+(right-left)/2;
int maxleft = maxHalf(nums,left,mid);
int maxright = maxHalf(nums,mid+1,right);
int maxboth = maxBoth(nums,left,mid,right);
int res = max(maxleft,maxright);
return max(res,maxboth);
}
int maxSubArray(vector<int>& nums) {
int n = nums.size();
if(n == 0) return 0;
return maxHalf(nums,0,n-1);
}
};