30 連續子陣列的最大和

2021-09-24 16:21:27 字數 1328 閱讀 6416

hz偶爾會拿些專業問題來忽悠那些非計算機專業的同學。今天測試組開完會後,他又發話了:在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全為正數的時候,問題很好解決。但是,如果向量中包含負數,是否應該包含某個負數,並期望旁邊的正數會彌補它呢?例如:,連續子向量的最大和為8(從第0個開始,到第3個為止)。給乙個陣列,返回它的最大連續子串行的和,你會不會被他忽悠住?(子向量的長度至少是1)

leetcode對應題目:53、最大子序和

leetcode課程裡面(九)動態規劃講過

總結:dp的經典題目,沒想到dp[i]的狀態表示的確很難做。

1、若dp儲存的是到第i個元素的最大陣列和可以麼?

不可以,[1,1,-4,5],若中間有個很大的負數,dp[3] = 7,然而題目要求是連續陣列!

2、dp儲存的是:以第i個元素結尾的最大和。可!因為這樣保證了dp[i-1],nums[i],dp[i]三者之間的關係

class solution  

vectordp(nums.size()+1,0);

int max_res = int_min;

for(int i = 1 ; i <= nums.size(); i++)

return max_res;

}};

優化:dp陣列是沒必要的,因為我們每次只跟前面乙個陣列元素有關,直接用乙個變數來儲存就可以了。

class solution 

return max_res;

}};

或者:

class solution 

else

if(presum > max) max = presum;

}return max;

}};

用分治也可以做:

我們需要把陣列一分為二,分別找出左邊和右邊的最大子陣列之和,然後還要從中間開始向左右分別掃瞄,求出的最大值分別和左右兩邊得出的最大值相比較取最大的那乙個。

class solution 

int helper(vector&nums,int left,int right)

t = midmax;//此時t表示從mid開始的左側連續子陣列之和

for(int i = mid+1;i<=right;i++)

return max(midmax,max(leftmax,rightmax));

}};

30 連續子陣列的最大和

題目描述 hz偶爾會拿些專業問題來忽悠那些非計算機專業的同學。今天測試組開完會後,他又發話了 在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全為正數的時候,問題很好解決。但是,如果向量中包含負數,是否應該包含某個負數,並期望旁邊的正數會彌補它呢?例如 連續子向量的最大和為8 從第0個...

30 連續子陣列的最大和

題目描述 hz偶爾會拿些專業問題來忽悠那些非計算機專業的同學。今天測試組開完會後,他又發話了 在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全為正數的時候,問題很好解決。但是,如果向量中包含負數,是否應該包含某個負數,並期望旁邊的正數會彌補它呢?例如 連續子向量的最大和為8 從第0個...

30連續子陣列的最大和

在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全為正數的時候,問題很好解決。但是,如果向量中包含負數,是否應該包含某個負數,並期望旁邊的正數會彌補它呢?例如 連續子向量的最大和為8 從第0個開始,到第3個為止 給乙個陣列,返回它的最大連續子串行的和,你會不會被他忽悠住?子向量的長度至...