给定比特币n天内的价格表,完成一个算法计算你通过买卖能获得的最大收益。要求考虑执行效率。
(你不能在第一次买入前卖出,而且一次买或者卖只能是一份,买卖次数不限,但你必须在再次购买前卖掉之前买入的比特币。)
a. 请写出编程思路
b. 请编码实现
举例:
价格表: [5,3,1,5,4,7,8,6]
输出: 8
解释: 第3天(价格1)买,第4天(价格5)卖, 收益4 ;然后第5天(价格4)买,第7天(价格8)的时候卖出, 收益4 ;总共收益8。
思路:
状态
有 买入(buy) 和 卖出(sell) 这两种状态。
转移方程
当天买的话意味着损失-prices[i],当天卖的话意味着增加prices[i],当天卖出总的收益就是 buy+prices[i]
可以有无限次的买入和卖出,也就是说买入状态之前可拥有卖出状态,所以转移方程:
buy = max(buy, sell - price[i])
sell = max(sell, buy + prices[i] )
边界
第一天 buy = -prices[0], sell = 0,最后返回 sell 即可。
实现:
public int maxProfit(int[] prices) {
if (prices.length <= 1)
return 0;
int buy = -prices[0], sell = 0;
for (int i = 1; i < prices.length; i++) {
buy = Math.max(buy, -prices[i]);
sell = Math.max(sell, prices[i] + buy);
}
return sell;
}
网友评论