编程之美 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)。