1. 程式人生 > >30、劍指offer--連續子數組最大和

30、劍指offer--連續子數組最大和

動態 計算機 i++ 初始 pre reat urn eat 開完

題目描述 HZ偶爾會拿些專業問題來忽悠那些非計算機專業的同學。今天測試組開完會後,他又發話了:在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全為正數的時候,問題很好解決。但是,如果向量中包含負數,是否應該包含某個負數,並期望旁邊的正數會彌補它呢?例如:{6,-3,-2,7,-15,1,2,2},連續子向量的最大和為8(從第0個開始,到第3個為止)。你會不會被他忽悠住?(子向量的長度至少是1) 解題思路:本題時動態規劃問題 dp[i]表示到以a[i]結尾的最長連續子數組的最大和 dp[i] = array[i] i==0 || dp[i-1]<0 dp[i] = dp[i-1] + array[i] i != 0 && dp[i-1] > 0
定義一個初始值為最小值的maxSum,然後如果dp[i]>maxSum maxSum = dp[i]最後返回maxSum
 1 class Solution {
 2 public:
 3     //dp[i] = array[i]  i==0 || dp[i-1]<0
 4     //dp[i] = dp[i-1] + array[i] i != 0 && dp[i-1] > 0
 5     int FindGreatestSumOfSubArray(vector<int> array) {
 6         int length = array.size();
7 if(array.empty() || length <=0) 8 return 0; 9 int dp[length]; 10 memset(dp,0,length); 11 dp[0] = array[0]; 12 int maxSum = 0x80000000; 13 for(int i=1;i<length;i++) 14 { 15 if(dp[i-1] > 0) 16 { 17 dp[i] = dp[i-1
] + array[i]; 18 } 19 else 20 { 21 dp[i] = array[i]; 22 } 23 if(dp[i] > maxSum) 24 { 25 maxSum = dp[i]; 26 } 27 } 28 return maxSum; 29 } 30 };

30、劍指offer--連續子數組最大和