買賣股票的最佳時機(兩道題)

題目1:給定一個數組,它的第 i 個元素是一支給定股票第 i 天的價格。

如果你最多隻允許完成一筆交易(即買入和賣出一支股票),設計一個算法來計算你所能獲取的最大利潤。

注意你不能在買入股票前賣出股票。

示例 1:

輸入: [7,1,5,3,6,4]
輸出: 5

解釋: 在第 2 天(股票價格 = 1)的時候買入,在第 5 天(股票價格 = 6)的時候賣出,最大利潤 = 6-1 = 5 。
注意利潤不能是 7-1 = 6, 因爲賣出價格需要大於買入價格。

示例 2:

輸入: [7,6,4,3,1]
輸出: 0

解釋: 在這種情況下, 沒有交易完成, 所以最大利潤爲 0。

動態規劃來解:設置變量記錄最大利益與最小開始值,每當遇到更小的值時,替換(因爲只有替換了纔可能會出現更大的利益),遇到更大的利益時替換。

int maxProfit(vector<int>& prices) {
	if (prices.size() < 2) return 0;
	int profit = 0, begin = prices[0];
	for (int i = 1; i < prices.size(); i++) {
		if (prices[i] < begin) begin = prices[i];
		if (profit < prices[i] - begin) profit = prices[i] - begin;
	}
	return profit;
}

題目2:與題1差距就在於可以完成多次交易
示例 1:

輸入: [7,1,5,3,6,4]
輸出: 7

解釋: 在第 2 天(股票價格 = 1)的時候買入,在第 3 天(股票價格 = 5)的時候賣出, 這筆交易所能獲得利潤 = 5-1 = 4

隨後,在第 4 天(股票價格 = 3)的時候買入,在第 5 天(股票價格 = 6)的時候賣出, 這筆交易所能獲得利潤 = 6-3 = 3 。

示例 2:

輸入: [1,2,3,4,5]
輸出: 4

解釋: 在第 1 天(股票價格 = 1)的時候買入,在第 5 天 (股票價格 = 5)的時候賣出, 這筆交易所能獲得利潤 = 5-1 = 4

注意你不能在第 1 天和第 2 天接連購買股票,之後再將它們賣出。
因爲這樣屬於同時參與了多筆交易,你必須在再次購買前出售掉之前的股票。

示例 3:

輸入: [7,6,4,3,1]
輸出: 0

解釋: 在這種情況下, 沒有交易完成, 所以最大利潤爲 0。

採用峯值的思想,將峯值差進行累加。

    int maxProfit(vector<int>& prices) {
        	if (prices.size() < 2) return 0;
	int max = 0;
	for (int i = 1; i < prices.size(); i++) {
		if (prices[i - 1] < prices[i]) max += prices[i] - prices[i - 1];
	}
	return max;
    }
發佈了44 篇原創文章 · 獲贊 0 · 訪問量 1291
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章