题目:
动态规划思想,dp[i]表示以 nums[i]结尾的最大子数组的和,那么
$$
dp[i] = max{ dp[i-1]+nums[i], nums[i]}
$$
即如果之前的子数组和加上 nums[i]比 nums[i]还小,那干脆从 nums[i]重新开始。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| #include <vector> using std::vector;
class Solution { public: int maxSubArray(vector<int> &nums) { int i, n = nums.size(); int max_sum = nums[0]; vector<int> dp(n); dp[0] = nums[0]; for (i = 1; i < n; i++) { dp[i] = std::max(dp[i - 1] + nums[i], nums[i]); max_sum = std::max(max_sum, dp[i]); } return max_sum; } };
|
leetcode hot 100 rewrite
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| #include <vector> #include <climits>
using std::vector;
class Solution { public: int maxSubArray(vector<int> &nums) { int i, n = nums.size();
if(n == 0) return 0;
int max_sum = nums[0];
vector<int> dp(n, 0);
dp[0] = nums[i];
for (i = 1; i < n; i++) { dp[i] = std::max(dp[i - 1] + nums[i], nums[i]); max_sum = std::max(max_sum, dp[i]); }
return max_sum; } };
|