目錄
問題:
給定一個整數數組arr, 求所有的子數組中 和最大的 子數組 。返回最大子數組和。
應用場景:
在金融中可以通過求一隻股票的價格區間中的最大子數組和來找到 價格波動最大的區間範圍,以便進一步分析。
分析:
1)解法方法一: 通過枚舉出該數組所有的子數組,在找到子數組和最大的即可。
2)動態規劃求解:
//Implement the MaxSubArr with dynamic programming.
/* Input: arr = [1,-3,4,5,6,-8,9,-30,18]
n = arr.szie();
i = 0...n-1
1)構造動態方程
該問題的狀態方程:dp[i]表示以元素arr[i]結尾時,的最大子數組和。
arr[0] if n>1 or n=1
dp[i] = dp[i-1] + arr[i] if dp[i-1] >0 and n>1
arr[i] if dp[i-1] < 0 and n>1
dp = [1,-2,4,9,15,7,16,-14,18]
2)遍歷dp,即可得到最大子數組和。
*/
C++實現
#include <iostream>
#include <vector>
using namespace std;
class Solution{
public:
int MaxSubArr(vector<int>& arr){
vector<int> dp;
int n = arr.size();
int max_sum = 0;
if ((n > 1) || (n==1)){
dp.push_back(arr[0]);
}
for(int i=1; i<n; i++){
dp.push_back(dp[i-1]>0 ? (dp[i-1]+arr[i]) : arr[i]);
}
for(int i=0; i<dp.size(); i++){
if (dp[i] >max_sum){
max_sum = dp[i];
}
}
return max_sum;
}
};
int main(){
vector<int> arr;
arr.push_back(1);
arr.push_back(-3);
arr.push_back(4);
arr.push_back(5);
arr.push_back(6);
arr.push_back(-8);
arr.push_back(9);
arr.push_back(-30);
arr.push_back(18);
Solution s;
cout << "MaxSum of SubArr : " << s.MaxSubArr(arr) << endl;
return 0;
}
特殊情況
當給定數組arr中都是負數時,該算法不適用。