原题链接:
https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-iii/description/
完成情况:
解题思路:
这段代码的目的是解决LeetCode上的第123题“买卖股票的最佳时机 III”。题目要求设计一个算法来计算你所能获取的最大利润,前提是你最多可以完成两笔交易。你不能同时参与多笔交易,必须在再次购买前出售掉之前的股票。
代码的核心思想是动态规划,通过记录四个状态变量来实现两次交易的最大利润。具体步骤如下:
-
初始化变量:
int n = prices.length; int buy1 = -prices[0], sell1 = 0; int buy2 = -prices[0], sell2 = 0;
n
表示股票价格数组的长度。buy1
表示第一次买入股票时的最大收益,初始化为-prices[0]
,即买入第一天的股票。sell1
表示第一次卖出股票时的最大收益,初始化为 0,因为还没有卖出。buy2
表示第二次买入股票时的最大收益,初始化为-prices[0]
,即再次买入第一天的股票。sell2
表示第二次卖出股票时的最大收益,初始化为 0,因为还没有第二次卖出。
-
遍历价格数组:
for (int i = 1; i < n; i++) { buy1 = Math.max(buy1, -prices[i]); sell1 = Math.max(sell1, buy1 + prices[i]); buy2 = Math.max(buy2, sell1 - prices[i]); sell2 = Math.max(sell2, buy2 + prices[i]); }
- 循环从第二天(索引1)开始遍历每一天的股票价格。
buy1 = Math.max(buy1, -prices[i]);
更新第一次买入时的最大收益,比较当前值和当天价格的负值(模拟买入)。sell1 = Math.max(sell1, buy1 + prices[i]);
更新第一次卖出时的最大收益,比较当前值和当天卖出后的收益。buy2 = Math.max(buy2, sell1 - prices[i]);
更新第二次买入时的最大收益,比较当前值和第一次卖出后再买入的收益。sell2 = Math.max(sell2, buy2 + prices[i]);
更新第二次卖出时的最大收益,比较当前值和第二次买入后再卖出的收益。
-
返回结果:
return sell2;
- 遍历结束后,返回
sell2
,即两次交易后的最大收益。
- 遍历结束后,返回
总结:这段代码利用动态规划的方法,记录并更新每一步的买卖状态,通过一次遍历就可以计算出最多完成两次交易时的最大收益。时间复杂度是 O(n),因为只需遍历一次价格数组。
参考代码:
_123买卖股票的最佳时机
package leetcode板块;
public class _123买卖股票的最佳时机 {
/**
*
* @param prices
* @return
*/
public int maxProfit(int[] prices) {
// 你最多可以完成 【两笔】 交易。
// 两次机会,你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
int n = prices.length;
int buy1 = -prices[0],sell1 = 0;
int buy2 = -prices[0],sell2 = 0;
// 允许同一天买入卖出
for (int i = 1;i<n;i++){
buy1 = Math.max(buy1,-prices[i]);
sell1 = Math.max(sell1,buy1 + prices[i]);
buy2 = Math.max(buy2,sell1 - prices[i]);
sell2 = Math.max(sell2,buy2 + prices[i]);
}
return sell2;
}
}