Problem: 53. 最大子数组和
文章目录
- 题目描述
- 思路及解法
- 复杂度
- Code
题目描述
思路及解法
1.定义dp数组:dp[i]表示以nums[i]为结尾的子序列的最大子序列和;
2.状态初始化:dp[0] = nums[0],表示以nums[0]为结尾的子序列的最大子序列和为nums[0]本身;
3.状态转移:注意上述定义的dp表示的实际意义是nums[i]为结尾的子序列的最大子序列和;若当前已经得到dp[i-1],则对于dp[i]我们要么在dp[i-1]的基础上再选择讲nums[i]加进来组成一个以nums[i]为结尾的最大子序列,要么直接选择nums[i];所以直接在二者中选择一个较大的赋值给dp[i]即可
4.计算结果:在dp数组中选出最大的值返回即可;
复杂度
时间复杂度:
O ( n ) O(n) O(n);其中 n n n为原数组 n u m s nums nums的大小
空间复杂度:
O ( 1 ) O(1) O(1)
Code
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;
}
};