力扣
题意输入一个整型数组,数组中的一个或连续多个整数组成一个子数组。
求所有子数组的和的最大值。
要求时间复杂度为O(n)。
所有子数组的情况无非就是以其中某个数字结尾的,肯定有一个子数组是符合我们的要求的。
动态规划解析:
- 状态定义: 假设动态规划列表 dp ,dp[i] 代表以元素 nums[i] 为结尾的连续子数组(有很多个)最大和。
-
转移方程: 若 dp[i−1]≤0 ,说明 dp[i−1] 对 dp[i] 产生负贡献,即 dp[i-1] + nums[i] 还不如 nums[i]本身大。
- 当 dp[i - 1] > 0 时:执行 dp[i] = dp[i-1] + nums[i];
- 当 dp[i−1]≤0 时:执行 dp[i] = nums[i];
-
初始状态: dp[0] = nums[0],即以 nums[0] 结尾的连续子数组最大和为nums[0] 。
-
返回值: 返回 dp列表中的最大值,代表全局最大值。
降低空间复杂度
- 由于 dp[i] 只与 dp[i-1] 和 nums[i] 有关系,因此可以将原数组 nums 用作 dp列表,即直接在 nums上修改即可。
- 由于省去 dp 列表使用的额外空间,因此空间复杂度从 O(N) 降至 O(1) 。
class Solution
{
public:
int maxSubArray(vector& nums)
{
int res=nums[0];//永存存放子数组的最大和
for(int i=1;i0?nums[i-1]+nums[i]:nums[i];
res=nums[i]>res?nums[i]:res;
}
return res;
}
};
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)