一、思路
动态规划
二、解题方法
使用了两个变量 maxSum
和 currentSum
来分别记录全局的最大和和当前连续子数组的和。遍历数组时,我们不断更新 currentSum
,并比较是否需要更新 maxSum
。最后,maxSum
就是最大的连续子数组和。
三、code
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int n=nums.size();
if(n==0)
{
return 0;
}
int maxSum=nums[0];// 初始化最大和为第一个元素
int currSum=nums[0];// 当前连续子数组的和
for(int i=1;i<n;++i)
{
// 对于每个元素,判断是继续扩展当前子数组,还是从当前元素重新开始一个子数组
currSum=std::max(nums[i],currSum+nums[i]);
// 更新最大和
maxSum=std::max(maxSum,currSum);
}
return maxSum;
}
};
=========================================================================学到的知识:
1、currentSum = std::max(nums[i], currentSum + nums[i]);
这行代码的作用是计算当前连续子数组的和 currentSum
,它有两个选择:
- 从当前元素
nums[i]
开始一个新的连续子数组,这是nums[i]
的值。 - 将当前元素
nums[i]
添加到之前的连续子数组中,即currentSum + nums[i]
。
这两个选择中,我们选择较大的那个作为当前连续子数组的和 currentSum
。这是因为我们希望找到的是具有最大和的连续子数组,如果将当前元素加入之前的连续子数组后和更大,那么就继续扩展当前连续子数组;如果当前元素更大,说明开始一个新的子数组可能会更有利于获得更大的和。
总之,这行代码的作用是在每个位置 i
更新当前连续子数组的和,以便后续比较是否需要更新最大和 maxSum
。