連續子陣列最大和
輸入一個整形陣列,數組裡有正數也有負數。
陣列中連續的一個或多個整陣列成一個子陣列,每個子陣列都有一個和。
求所有子陣列的和的最大值。要求時間複雜度為O(n)。
例如輸入的陣列為1, -2, 3, 10, -4, 7, 2, -5,和最大的子陣列為3, 10, -4, 7, 2,
因此輸出為該子陣列的和18。
直接上程式碼
#include <iostream.h> int maxSum(int* a, int n) { int sum=0; //其實要處理全是負數的情況,很簡單,如稍後下面第3點所見,直接把這句改成:"int sum=a[0]"即可 //也可以不改,當全是負數的情況,直接返回0,也不見得不行。 int b=0; for(int i=0; i<n; i++) { if(b<0) //... b=a[i]; else b+=a[i]; if(sum<b) sum=b; } return sum; } int main() { int a[10]={1, -2, 3, 10, -4, 7, 2, -5}; //int a[]={-1,-2,-3,-4}; //測試全是負數的用例 cout<<maxSum(a,8)<<endl; return 0; }
解釋下:
例如輸入的陣列為1, -2, 3, 10, -4, 7, 2, -5,那麼最大的子陣列為3, 10, -4, 7, 2,
因此輸出為該子陣列的和18。
所有的東西都在以下倆行,
即:
b : 0 1 -1 3 13 9 16 18 13
sum: 0 1 1 3 13 13 16 18 18
其實演算法很簡單,當前面的幾個數,加起來後,b<0後,
把b重新賦值,置為下一個元素,b=a[i]。
當b>sum,則更新sum=b;
若b<sum,則sum保持原值,不更新。。July、10/31。