解題思路
最大子序列和求解
思路參考自LeetCode的某位同學題解
對其中的將兩者之差轉換爲最大連續子序列和的更形象的解釋如下:
對於a[i]-a[j]可展開成如下形式
a[i]-a[j]
=a[i]-a[i-1]+a[i-1]-a[i-2]+…+a[j+1]-a[j]
=diff[i]+diff[i-1]+…+diff[j+1]
舉例:假設輸入爲[7,1,5,3,6,4]的序列,輸出爲5,
則我們知道a[4]-a[1]爲最大,等於5
按上述思路可知:
a[4]-a[1]=diff[4]+diff[3]+diff[2]
而diff數組爲[-6,4,-2,3,-2],注意假設diff數組從0開始,則對應於上文的diff[1]對應上文的diff[2],依次類推
diff[2]=4,diff[3]=-2,diff[4]=3
因此a[4]-a[1]=4-2+3=5
代碼
class Solution {
public:
int maxProfit(vector<int>& prices) {
if (prices.size() <= 1) return 0;//prices.size()只有1個或0個元素,直接返回0
vector<int> diff(prices.size() - 1);//存儲兩兩的差值
vector<int> dp(prices.size() - 1);//dp[i]表示以diff[i]作爲末尾的連續序列的最大和
for (int i=0;i<prices.size()-1;i++)
{
diff[i] = prices[i + 1] - prices[i];//計算diff
}
//邊界
dp[0] = max(0,diff[0]);//注意這裏但對初始狀態要進行一個比較,如果diff[0]比0小,則要取0
//狀態轉移方程
for (int i=1;i<diff.size();i++)
{
dp[i] = max(0, dp[i - 1] + diff[i]);
}
//輸出連續子序列的最大值
vector<int>::iterator myMax = max_element(dp.begin(), dp.end());//求出dp中的最大值
return *myMax;
}
};