返回一个整数数组中最大子数组的和2

 

要求:

输入一个一维整形数组,数组里有正数也有负数。

一维数组首尾相接,象个一条首尾相接带子一样。

数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。时间复杂度O(n)

 

思路分析:

先说点题外话,课上那两种方法我感觉没一个对的。

这个题其实和上回那个题基本一样,只不过这回把这个一维数组连成环了。不过仍然是求最大子数组的和,首尾相接的。说实话循环两次说起来容易做起来不好控制。不妨换个思路,想想看,上次求了个不是首尾相接的最大值,这回干脆按照上回的思路求个最小值,再用整个数组的和减去这个最小值就搞定了。具体求非首尾相接子数组最小和的思路不再细讲,直接上代码。

 

 

 1 int main(){
 2     system("title 08返回一个整数数组中最大子数组的和");
 3     cout << "数字要求:必须有正数和负数同时存在,可以有0" << endl;
 4     int len = 0;
 5     cout << "输入数组长度:";
 6     cin >> len;
 7     int*a = new int[len];
 8     cout << "输入" << len << "个数字:";
 9     for (int i = 0; i < len; ++i)
10         cin >> a[i];
11     int sum = 0;
12     int sum1 = 0;
13     int min = a[0];
14     for (int i = 0; i < len; ++i){
15         sum1 += a[i];
16         if (sum + a[i] >= 0)sum = 0;
17         else sum += a[i];
18         min = min<sum ? min : sum;
19     }
20     cout << "最大子数组的和:"<<sum1 - min << endl;
21     return 0;
22 }

 

验证截图:

总结:

还是关于贪心算法的问题,不过这次拐了个弯儿。

 

 

原文地址:https://www.cnblogs.com/messi2017/p/8349751.html