Leetcode - 買賣股票的最佳時機
阿新 • • 發佈:2018-11-20
https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/
題目描述
給定一個數組,它的第 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。
解題思路
該題解法和最大連續子陣列和的解法思路是一樣的。
1、根據股票的利益意義,想要更多利益則值低時買進,值高時賣出。根據提供的股票價格不方便得出股票價格變化,對原資料進行計算:list[i] - list[i-1] = 股票的變化。變化為正時股票增長(存在利益),變化為負時股票為下跌(無利益)。
2、得到股票的變化值列表,即求最大子陣列和,最後得到正解。
#define max(a, b) a > b ? a : b int maxProfit(int* prices, int pricesSize) { int max=0,s, i, j, dp[1000010], nums[1000010]; for (i = 0; i < pricesSize - 1; i++) nums[i] = prices[i + 1] - prices[i]; max = dp[0] = nums[0]; if (max < 0) max = 0; for (int i = 1; i < pricesSize - 1; i++) { if (dp[i - 1] < 0) dp[i - 1] = 0; dp[i] = dp[i - 1] + nums[i]; max = max(max, dp[i]); } return max; }