[容易]最大子数组

题目来源:http://www.lintcode.com/zh-cn/problem/maximum-subarray/

最直观的方法,三个for循环三层遍历,求出数组中每一个子数组的和,最终求出这些子数组的最大的一个值。 令currSum[i, …, j]为数组A中第i个元素到第j个元素的和(其中0 <= i <= j < n),maxSum为最终求到的最大连续子数组的和。但是时间复杂度上通不过:

 1 class Solution {
 2 public:    
 3     /**
 4      * @param nums: A list of integers
 5      * @return: A integer indicate the sum of max subarray
 6      */
 7     int maxSubArray(vector<int> nums) {
 8         // write your code here
 9         int maxSum = nums[0];
10         int currSum = 0;
11         for (int i = 0; i < nums.size(); i++)
12         {
13             for (int j = i; j < nums.size(); j++)
14             {
15                 for (int k = i; k <= j; k++)
16                 {
17                     currSum += nums[k];
18                 }
19             if (currSum > maxSum)
20                 maxSum = currSum;
21             currSum = 0; 
22         }
23     }
24     return maxSum;
25     }
26 };

事实上,当我们令currSum为当前最大子数组的和,maxSum为最后要返回的最大子数组的和,当我们往后扫描时,

  • 对第j+1个元素a[j]有两种选择:要么放入前面找到的子数组,要么做为新子数组的第一个元素;如果currSum加上当前元素a[j]后不小于a[j],则令currSum加上a[j],否则currSum重新赋值,置为下一个元素,即currSum = a[j]。
  • 同时,当currSum > maxSum,则更新maxSum = currSum,否则保持原值,不更新。即:

currSum = max(a[j], currSum + a[j]

maxSum = max(maxSum, currSum)

举个例子,当输入数组是 1, -2, 3, 10, -4, 7, 2, -5 ,那么,currSum和maxSum相应的变化为:

  • currSum: 0 1 - 1 3 13 9 16 18 13
  • maxSum : 0 1 1 3 13 13 16 18 18

可以accept的程序如下:

 1 class Solution {
 2 public:    
 3     /**
 4      * @param nums: A list of integers
 5      * @return: A integer indicate the sum of max subarray
 6      */
 7     int maxSubArray(vector<int> nums) {
 8         // write your code here
 9         int currSum = 0;
10         int maxSum = nums[0];
11 
12         for (int j = 0; j < nums.size(); j++)
13         {
14             currSum = max(nums[j],currSum + nums[j]);
15             maxSum = max(maxSum,currSum);
16         }
17         return maxSum;
18     }
19 };
posted @ 2016-05-05 21:55  Pearl_zju  阅读(230)  评论(0编辑  收藏  举报