日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

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

發布時間:2024/10/12 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 编程之美 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求数组的子数组之和的最大值的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。