题目链接:53. Maximum Subarray
题目大意:给出一段整数数组,找出其中一段总和最大的连续子段,输出最大值。
注意点:
- 子序列要求连续,不能中断
- 判断给出数列长度为0的情况
- 动态规划的起点,求解过程
一.算法设计
这是一道经典的动态规划问题,当然它可以通过数组遍历的方式来暴力求解,其时间复杂度为O( n 2 n^2 n2),这显然不是我想要讨论的内容
这里利用动态规划的方式来求解
dp[i]表示以
a
[
i
]
a[i]
a[i]结尾的最大子段和
所求的最大值为max(dp[i]), 0 < i < n;
以下是状态转移方程:
- dp[i] = 0, 数组长度为0时
- dp[i] = dp[i-1] + a[i], 数组长度大于0且dp[i-1]大于等于0
- dp[i] = a[i], 数组长度大于0且dp[i-1]小于0
其时间复杂度为O(n)
二.算法实现
这里要注意初始化dp数组,将nums数组的第一个值先赋值给dp[0].
与此同时,将最大值先初始化为dp[0].
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int len = nums.size();
if(len == 0) return 0;
vector<int> dp(len);
dp[0] = nums[0];
int max_num = dp[0];
for(int i = 1; i < len; i++){
if(dp[i-1] >= 0) dp[i] = dp[i-1] + nums[i];
else dp[i] = nums[i];
max_num = max(max_num, dp[i]);
}
return max_num;
}
};