题目:
给你一个整数数组 nums
,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组 是数组中的一个连续部分。
示例 1:
输入: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 i, m;
vector<int>max;
max.resize(nums.size());
max[0] = nums[0];
for (i = 1;i < nums.size();i++)
{
if (max[i - 1] < 0)
{
max[i] = nums[i];
}
else
{
max[i] = max[i - 1] + nums[i];
}
}
m = max[0];
for (i = 0;i < nums.size();i++)
{
if (max[i] > m)
{
m = max[i];
}
}
return m;
}
};
思考:max[i]表示终点下标为i的最大子序列,首先对于max[0]指定为nums[0],然后从1开始遍历nums数组,
当max[i-1]<0时,即终点下标为i-1时最大连续子序列和小于0,考虑此时
1.如果第i位为正数,正数+负数<正数,不如重新规划第i位的最大连续子序列和,即max[i]=nums[i]
2.如果第i位为负数,负数+负数<原先的负数,不如重新规划第i位的最大连续子序列和,即max[i]=nums[i]
当max[i-1]>0时,即终点下标为i-1时最大连续子序列和大于0,考虑此时
1.如果第i位为正数,正数+正数>原先的正数,更新此时的最大连续子序列和
2.如果第i位为负数,加上此负数虽然会导致和减小,但此时更新的是第i位的最大连续子序列和,第i-1位最大连续子序列和不变
最后遍历max即可寻找答案