描述
分析
动态规划问题,时间复杂度
O
(
N
)
O(N)
O(N).
使用数组 dp[N],其中dp[i] 表示以第 i 个元素结尾的最大子序和。
每个dp[i] 都对应两种情况:
- 加上第 i 个元素还不如不加(
dp[i] > dp[i-1] + nums[i]
),此时dp[i] = nums[i]
; - 加上第 i 个元素后的最大子序和比不加要大,此时
dp[i] = dp[i-1] + nums[i]
;
代码
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int len = nums.size();
if (len == 1) return nums[0];
int max_sum = nums[0];
vector<int> dp(len);
dp[0] = nums[0];
for (int i = 1;i < len;i++) {
int t = dp[i - 1] + nums[i];
dp[i] = t >= nums[i] ? t : nums[i];
if (dp[i] > max_sum)
max_sum = dp[i];
}
return max_sum;
}
};