编程之美 2.14求数组的子数组之和的最大值

对于一个有N个元素的数组,a[0]~a[n-1],求子数组最大值。

如:数组A[] = [−2, 1, −3, 4, −1, 2, 1, −5, 4],则连续的子序列[4,−1,2,1]有最大的和6.

方法一:暴力

循环遍历,输出所有,判断最大的和

 1 #include"iostream"
 2 #define MAX 1001
 3 using namespace std;
 4 
 5 int main(){
 6     int n, a[MAX], sum , maxsum ;
 7 
 8     cin >> n;
 9     for (int i = 0; i<n; i++)
10     {
11         cin >> a[i];
12     }
13     maxsum = a[0];
14 
15     for (int i = 0; i<n; i++)
16     {
17         sum = 0;
18         for (int j = i; j<n; j++)
19         {
20             sum += a[j];
21             if (maxsum<sum)
22                 maxsum = sum;
23         }
24     }
25     cout << maxsum;
26 
27 }

需要注意的是,数组可能全负{-1,-2,-3,-4},最大为-1.

时间复杂度O(n^2)

方法二:

遍历数组,依次判断数组中的每一个元素的值 将其与0作比较,
如果其大于等于0,
    再判断之前子数组的和是否大于0,
    如果之前子数组的和小于0,
        则当前元素即为当前子数组之和。
    如果之前子数组之和大于0,
        则将当前元素与之前子数组之和相加,相加之和作为当前子数组之和。
如果其小于0
    判断Max是否大于等于0
    如果Max大于等于0
        则将当前元素与之前子数组之和相加,相加之和作为当前子数组之和,跳过循环
    如果Max小于0
        当前子数组之和即为当前元素

将当前子数组之和与最大值Max作比较
如果其大于最大值,则更新
 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     int n, s[10], sum, Max;
 8 
 9     cin >> n;
10     for(int i = 0; i < n; ++i)
11         cin >> s[i];
12 
13     for(int i = 0; i < n; ++i)
14     {
15         if(i == 0)
16             Max = sum = s[i];   //将sum和Max初始化为数组中的第一个元素的值。
17         else
18         {
19             if(s[i] >= 0)
20             {
21                 if(sum <= 0)
22                     sum = s[i];
23                 else
24                     sum = sum + s[i];
25             }
26             else
27             {
28                 if(Max >= 0)
29                 {
30                     sum = 0;
31                     continue;
32                 }
33 
34                 else
35                     sum = s[i];
36             }
37 
38             if(sum > Max)
39                 Max = sum;
40         }
41     }
42     cout << "max = " << Max << endl;
43     return 0;
44 }

时间复杂度为O(n)。

原文地址:https://www.cnblogs.com/SeekHit/p/5568339.html