剑指 Offer 42. 连续子数组的最大和

思路

 方法一:动态规划

 1 class Solution {
 2 public:
 3     int maxSubArray(vector<int>& nums) {
 4         //memo[i]表示以nums[i]结尾并且包含nums[i]的子数组的最大和
 5         vector<int> memo(nums.size());
 6         memo[0] = nums[0];
 7 
 8         for(int i = 1; i < nums.size(); ++i) {
 9             if(memo[i-1] > 0)
10                 memo[i] = memo[i-1] + nums[i];
11             else
12                 memo[i] = nums[i];
13         }
14 
15         int maxSum = memo[0];
16         for(int i = 1; i < memo.size(); ++i) {
17             if(memo[i] > maxSum)
18                 maxSum = memo[i];
19         }
20 
21         return maxSum;
22     }
23 };

复杂度分析

时间复杂度:O(n)

空间复杂度:O(n)

 方法二:模拟

 1 class Solution {
 2 public:
 3     int maxSubArray(vector<int>& nums) {
 4         int maxSum = nums[0];
 5         int thisSum = nums[0];
 6 
 7         for(int i = 1; i < nums.size(); ++i) {
 8             if(thisSum < 0)
 9                 thisSum = 0;
10 
11             thisSum += nums[i];
12             if(thisSum > maxSum)
13                 maxSum = thisSum;
14         }
15 
16         return maxSum;
17     }
18 };

复杂度分析

时间复杂度:O(n)

空间复杂度:O(1)

原文地址:https://www.cnblogs.com/FengZeng666/p/13937943.html