编程之美 2.14求数组的子数组之和的最大值
生活随笔
收集整理的這篇文章主要介紹了
编程之美 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
總結
以上是生活随笔為你收集整理的编程之美 2.14求数组的子数组之和的最大值的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 农行信用卡提额技巧
- 下一篇: left edge algorithm.