[容易]最大子数组
题目来源: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 };
-------------------------------------------------
原创博客 转载请注明出处http://www.cnblogs.com/hslzju
-------------------------------------------------