【面试题经典重温【原创】】求子数组的最大和

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

看完何海涛的解答,我觉得这个题目可以抽象到一个更高的层次,与某些问题有异曲同工之妙,比如判断单链表是否有环、寻找单链表中的倒数第K个元素,包含min函数的栈等,都是定义两个变量,一个是主变量,一个是辅助变量。

程序中,定义了两个变量,一个变量求连续子数组的和,另一个变量的作用是记录这整个过程中最大的那个和。

需要考虑到的特殊情况是 1、异常输入,比如数组长度为0;2、数组元素全部为负数的时候,题目退化成寻找最大的元素。

根据以上的信息,我们可以写出如下的代码:

 1 #include<iostream>
 2 
 3 using namespace std;
 4 int maxSubSum(int a[],int length)
 5 {
 6     int sum = 0,temp = 0,i;
 7     if(length <= 0)
 8     {
 9         cout << "error input" << endl;
10         return 0;
11     }
12     for(i=0;i<length;i++)
13     {
14         sum += a[i];
15         if(sum < 0)
16             sum = 0;
17         if(sum > temp)
18             temp = sum;
19     }
20     if(temp == 0)//全部为负数
21     {
22         temp = a[0];
23         for(i = 1;i<length;i++)
24         {
25             if(a[i] > temp)
26                 temp = a[i];
27         }
28     }
29 
30     return temp;
31 }
32 int main()
33 {
34 
35     int a[8] = {1, -2310, -472, -5};
36 
37     int result = maxSubSum(a,8);
38     
39     cout << result <<endl;
40     system("pause");
41     
42     return 0;
43 }

程序只完成了基本的功能,需要交互输入的时候可以更改。

原文地址:https://www.cnblogs.com/xiawen/p/3044322.html