Category |
Difficulty |
Likes |
Dislikes |
algorithms |
Hard (57.21%) |
1215 |
- |
Tags
array
| dynamic-programming
Companies
Unknown
给定一个数组,它的第 i
个元素是一支给定的股票在第 i
天的价格。
设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
示例 1:
1 2 3 4
| 输入:prices = [3,3,5,0,0,3,1,4] 输出:6 解释:在第 4 天(股票价格 = 0)的时候买入,在第 6 天(股票价格 = 3)的时候卖出,这笔交易所能获得利润 = 3-0 = 3 。 随后,在第 7 天(股票价格 = 1)的时候买入,在第 8 天 (股票价格 = 4)的时候卖出,这笔交易所能获得利润 = 4-1 = 3 。
|
示例 2:
1 2 3 4 5
| 输入:prices = [1,2,3,4,5] 输出:4 解释:在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。 注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。 因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。
|
示例 3:
1 2 3
| 输入:prices = [7,6,4,3,1] 输出:0 解释:在这个情况下, 没有交易完成, 所以最大利润为 0。
|
示例 4:
提示:
1 <= prices.length <= 105
0 <= prices[i] <= 105
代码
(动态规划)c++
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
| /* * @lc app=leetcode.cn id=123 lang=cpp * * [123] 买卖股票的最佳时机 III */
// @lc code=start class Solution { public: int maxProfit(vector<int>& prices) { /** * 单天买入卖出的话,赚的钱为0,不影响答案。 * 在已知股票的情况下,选择最优的交易方式,且最多可以完成两笔交易 * buy1[0] = -prices[0]; buy1[i] = max(buy1[i - 1], -prices[i]) * sell1[0] = 0; sell1[i] = max(sell1[i - 1], prices[i] + buy1[i]) * buy2[0] = -prices[0]; buy2[i] = max(buy[i - 1], sell1[i] + prices[i]) * sell2[0] = 0; sell2[i] = max(sell2[i - 1], prices[i] + buy2[i]) */ int len = prices.size(); /** * 因为是同步操作,可以用变量替代列表,优化空间 */ // vector<int> buy1(len, 0), sell1(len, 0), buy2(len, 0), sell2(len, 0); // buy1[0] = buy2[0] = -prices[0]; /** * 因为是同步操作,可省略为一个循环。 */ // for (int i = 1; i < len; ++i) { // buy1[i] = max(buy1[i - 1], -prices[i]); // } // sell1[0] = sell2[0] = 0; // for (int i = 1; i < len; ++i) { // sell1[i] = max(sell1[i - 1], buy1[i] + prices[i]); // } // for (int i = 1; i < len; ++i) { // buy2[i] = max(buy2[i - 1], sell1[i] - prices[i]); // } // for (int i = 1; i < len; ++i) { // sell2[i] = max(sell2[i - 1], prices[i] + buy2[i]); // } // int res = sell1[len-1] > sell2[len-1] ? sell1[len-1] : sell2[len-1]; /* 因为sell1[0] = sell2[0] = 0,所以不需要判断res小于0 */ // return res > 0 ? res : 0; // return res; int buy1, buy2, sell1, sell2; buy1 = buy2 = -prices[0]; sell1 = sell2 = 0; for (int i = 1; i < len; ++i) { buy1 = max(buy1, -prices[i]); sell1 = max(sell1, buy1 + prices[i]); buy2 = max(buy2, sell1 - prices[i]); sell2 = max(sell2, buy2 + prices[i]); } /* sell2的值建立在buy2上,而buy2最小值也为sell1的最大值减去prices[i],如果第二次购买值 不会大于第一次,则会出现当天买当天卖的情况,值仍然是最大值 */ // return sell2[len-1]; return sell2; } }; // @lc code=end
|