剑指 Offer 42. 连续子数组的最大和
思路:动态规划
- 状态定义:dp[i]代表以元素nums[i]为结尾的连续子数组最大和。
- 转移方程:dp[i]=max(dp[i-1]+nums[i],nums[i])
- 初始状态:dp[0]=nums[0]
- 返回值:返回dp列表中最大值
空间复杂度降低:
- 由于dp[i]只于dp[i-1]和nums[i]有关,因此可以将原数组nums用作dp列表
- 由于省去dp列表使用的额外空间,空间复杂度由O(N)降至O(1)
class Solution {
public:
int maxSubArray(vector<int>& nums) {
if(nums.empty()) return 0;
int res=nums[0];
for(int i=1;i<nums.size();++i){
nums[i]=max(nums[i-1]+nums[i],nums[i]);
res=max(res,nums[i]);
}
return res;
}
};
时间复杂度 O(n)
空间复杂度 O(1)