难度简单2757
给定一个整数数组
nums
,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。示例:
输入: [-2,1,-3,4,-1,2,1,-5,4] 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。进阶:
如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。
动态规划解法
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int pre = 0, res = nums[0];
for(const auto &x: nums){
pre = max(pre + x, x);
res = max(res, pre);
}
return res;
}
};
当只想读取range中元素时,使用const auto&, 如:for(const auto&x:range),它不会进行拷贝,也不会修改range
auto:在块作用域、命名作用域、循环初始化语句等等 中声明变量时,关键词auto用作类型指定符。
const:修饰符
想要拷贝元素:for(auto x:range)
想要修改元素 : for(auto &&x:range)
想要只读元素:for(const auto& x:range)
官方题解的动态规划解法好简洁啊,我自己写的就很长代码,道理是一样的,是判断当前值加上前面字段和不加上的大小。
//动态规划求解最大子段和问题
int maxSubSumDP(int a[], int n){
int f[n+1];
f[0] = 0;
int res = -0x3f3f3f3f;
for (int i = 1; i <= n; i++){
if (f[i-1] >= 0){
f[i] = f[i-1] + a[i];
}else{
f[i] = a[i];
}
res = max(res, f[i]);
}
return res;
我这里先将res值设定得非常小,因为数组值有可能是负数,需要考虑进去,所以初值不能是0之类的。