53. 最大子数组和
思路1–贪心
由于要求最大子数组的和,并且连续的,我们就可以通过贪心一直获取数据,一旦发现,加上数组元素结果和为正数,说明接下来继续选取数据有可能使得结果和是更大的值,一旦发现,加上数组元素是结果和是负数,那么我们就可以去掉之前区间的和的值,重新选取新区见继续贪心下去;
class Solution {
//贪心:
//思路:只要遍历找一直加,一旦加到数字为负数,那么就跳过该序列
//只有是正数的序列才有可能是最大的连续子序列
public:
int maxSubArray(vector<int>& nums) {
int result = INT_MIN;
int sum =0;
for(int i = 0; i<nums.size();i++)
{
sum += nums[i];
if(sum > result) //每加一个数字,判断新的子序和sum是否比之前的子序和result大,
//相当于取区间的最大值
{
result = sum;
}
//如果sum子序列和是负数那么就重置了,相当于去掉旧区间,重选了新区间
if(sum <= 0) sum = 0;
}
return result;
}
};
思路2–动态规划
class Solution {
public:
//题目要我们找出和最大的连续子数组的值是多少,「连续」是关键字,连续很重要,不是子序列。
//题目只要求返回结果,不要求得到最大的连续子数组是哪一个。这样的问题通常可以使用「动态规划」解决。
//设计状态思路:把不确定的因素确定下来,进而把子问题定义清楚,把子问题定义得简单。
//动态规划的思想通过解决了一个一个简单的问题,进而把简单的问题的解组成了复杂的问题的解。
//这里的不确定因素就是连续子序列数组最大和不知道时哪一个
int maxSubArray(vector<int>& nums) {
int result = nums[0];
vector<int> dp(nums.size());//d[i]标识以 nums[i]结尾的连续子序列的最大和
dp[0] = nums[0];
for(int i = 1;i<nums.size();i++)
{
dp[i] = max(dp[i -1] + nums[i],nums[i]); //求子序列的最大和
result = max(result,dp[i]); //d[i]当前子序列最大和,和之前子序列最大和比较
}
return result;
}
};