给定一个整数数组 nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
力扣原题链接
示例:
输入:[ -2, 1, -3, 4, -1, 2, 1, -5, 4 ]
输出:6
解释:连续子数组[4,-1,2,1]的和最大,为6
暴力求解:
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int n = nums.size(),max=nums[0],sum=0;
for (int i = 0; i < n; i++)
{
sum = 0;//暴力求解
for (int j = i; j < n; j++) {
sum += nums[j];
if (max < sum)
max = sum;
}
}
return max;
}
};
贪心法:
当前和小于0时则丢弃,如此进行比较;
时间复杂度:O (N),空间复杂度:O (1)
class Solution {
public:
int maxSubArray(vector<int>& nums) {
//maxSum为最大和,curSum为当前和
int n = nums.size(),maxSum=nums[0],curSum=nums[0];
//贪心法:当之前和小于0时丢弃
for (vector<int>::iterator it = nums.begin() + 1; it != nums.end(); it++)
{
if (curSum < 0)
curSum = 0;
curSum += *it;
if (maxSum < curSum)
maxSum = curSum;
}
return maxSum;
}
};
动态规划法:
思想:当前一元素大于零时加到当前元素,挑出最大值即可。
class Solution {
public:
int maxSubArray(vector<int>& nums) {
//动态规划
int n = nums.size(),max=nums[0];
for (int low = 0,fast=1; fast < n; fast++,low++) {
//设置快慢指针
if (nums[low] > 0)//前一元素大于零
nums[fast] += nums[low];
if (max < nums[fast])//比较得到最大值
max = nums[fast];
}
return max;
}
};