【LeetCode】121. 買賣股票的最佳時機

解題思路

最大子序列和求解
思路參考自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;
	}
};
發佈了99 篇原創文章 · 獲贊 19 · 訪問量 8188
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章