题目:给你一个整数数组 nums
,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
子数组 是数组中的一个连续部分。
首先说一下,子数组和子序列。
例如题目示例1:nums = [-2,1,-3,4,-1,2,1,-5,4]
子数组可以是 -2,1,3也可以是 -3,4,-1,2子数组要求连续。
子序列可以是-2,-3,-1也可以是 1,2,4 子序列不要求连续。
本题目要求找相加和最大的一个子数组,这里介绍一下使用动态规划计算。
dp数组初始化:dp[0] = nums[0]
递推公式:dp数组的上一个数如果大于0,与nums数组中的当前遍历到的值相加。否则,前面的舍弃,重新计算和,直接赋值为nums[i]。(因为前面的数小于0,代表前面相加的和是负数,如果带上只会减小当前的和,所以应该舍弃掉重新计算)。
代码:
class Solution {
public:
int maxSubArray(vector<int>& nums) {
vector<int> dp(nums.size());
int max = nums[0];
dp[0] = nums[0];
for(int i = 1; i < dp.size(); i++) {
if(dp[i-1] > 0) dp[i] = dp[i-1] + nums[i];
else dp[i] = nums[i];
if(dp[i] > max) max = dp[i];
}
return max;
}
};