题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为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, -2, 3, 10, -4, 7, 2, -5};
36
37 int result = maxSubSum(a,8);
38
39 cout << result <<endl;
40 system("pause");
41
42 return 0;
43 }
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, -2, 3, 10, -4, 7, 2, -5};
36
37 int result = maxSubSum(a,8);
38
39 cout << result <<endl;
40 system("pause");
41
42 return 0;
43 }
程序只完成了基本的功能,需要交互输入的时候可以更改。