最大连续子数组和

快来打我* 2022-08-06 01:06 290阅读 0赞

最大连续子数组和

1. 题目描述

输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。 求所有子数组的和的最大值,要求时间复杂度为O(n)。

例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2, 因此输出为该子数组的和18。

2. 解法一:三层搜索

这个解法使用了3层搜索,时间复杂度为O(n^3)。

第一层搜索:i遍历数组中所有数,作为子数组的起始点;

第二层搜索:j遍历i到数组最后一个数,作为子数组的终止点;

第三层搜索:k遍历i到j,求得当前子数组和curSum,与maxSum比较;

我们再用下图来展示上层搜索过程:

Center

  1. #include<iostream>
  2. using namespace std;
  3. int MaxSubSum(int *a, int num)
  4. {
  5. int curSum=0;
  6. int maxSum=a[0];
  7. for(int i=0; i<num; i++)
  8. {
  9. for(int j=i; j<num; j++)
  10. {
  11. for(int k=i; k<=j; k++)
  12. {
  13. curSum+=a[k];
  14. }
  15. if(curSum>maxSum)
  16. maxSum=curSum;
  17. curSum=0;
  18. }
  19. }
  20. return maxSum;
  21. }
  22. int main()
  23. {
  24. int a[8]={1, -2, 3, 10, -4, 7, 2, -5};
  25. int num=8;
  26. int maxSum=MaxSubSum(a, num);
  27. cout<<maxSum<<endl;
  28. return 0;
  29. }

3. 解法二:前顾后盼法

其实我们是需要遍历一次即可,在遍历的这一次中,我们可以同时完成curSum和maxSum的工作。思路如下:

https://github.com/julycoding/The-Art-Of-Programming-By-July/blob/master/ebook/zh/02.04.md

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

代码如下:

  1. #include<iostream>
  2. using namespace std;
  3. int MaxSubSum(int *a, int num)
  4. {
  5. int curSum=0;
  6. int maxSum=a[0];
  7. for(int i=0; i<num; i++)
  8. {
  9. curSum=(curSum+a[i]>a[i]) ? curSum+a[i] : a[i];
  10. maxSum=maxSum>curSum ? maxSum : curSum;
  11. }
  12. return maxSum;
  13. }
  14. int main()
  15. {
  16. int a[8]={1, -2, 3, 10, -4, 7, 2, -5};
  17. int num=8;
  18. int maxSum=MaxSubSum(a, num);
  19. cout<<maxSum<<endl;
  20. return 0;
  21. }

发表评论

表情:
评论列表 (有 0 条评论,290人围观)

还没有评论,来说两句吧...

相关阅读

    相关 连续

    HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。

    相关 连续

    最大连续子数组和 1. 题目描述 输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。 求所有

    相关 连续

    题目描述 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候

    相关 连续

    题目描述 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候