Problem: 53. 最大子数组和
文章目录
题目描述
思路及解法
1.定义dp数组:dpi表示以numsi为结尾的子序列的最大子序列和;
2.状态初始化:dp0 = nums0,表示以nums0为结尾的子序列的最大子序列和为nums0本身;
3.状态转移:注意上述定义的dp表示的实际意义是numsi为结尾的子序列的最大子序列和 ;若当前已经得到dpi-1,则对于dpi我们要么在dpi-1的基础上再选择讲numsi加进来组成一个以numsi为结尾的最大子序列,要么直接选择numsi;所以直接在二者中选择一个较大的赋值给dpi即可
4.计算结果:在dp数组中选出最大的值返回即可;
复杂度
时间复杂度:
O ( n ) O(n) O(n);其中 n n n为原数组 n u m s nums nums的大小
空间复杂度:
O ( 1 ) O(1) O(1)
Code
cpp
class Solution {
public:
/**
* Dynamic programing
* @param nums Given arr
* @return int
*/
int maxSubArray(vector<int>& nums) {
int n = nums.size();
vector<int> dp(n + 1);
dp[0] = nums[0];
for (int i = 1; i < n; ++i) {
dp[i] = max(dp[i - 1] + nums[i], nums[i]);
}
int max = INT_MIN;
for (int i = 0; i < n; ++i) {
if (dp[i] > max) {
max = dp[i];
}
}
return max;
}
};

