LeetCode 123. Best Time to Buy and Sell Stock III

Posted CrazyCoder1992

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 123. Best Time to Buy and Sell Stock III相关的知识,希望对你有一定的参考价值。

看了网上的几种解决方法,差异很大,不禁感慨逻辑之美及其多样性。

这里选取一种最容易理解的方法,也是一种很有意思的解法。Talk is cheap,上代码。

package com.crazycoder.leetcode.dynamicprogramming;

public class BestTimetoBuyAndSellStock3 
	/**
	 * 求最大收益
	 * 
	 * buy1, sell1, buy2, sell2表示两次交易的四个状态,其中下标i表示在前i天内完成该状态,剩余资金的最大值。
	 * 
	 * @param prices 每天的价格
	 * @return 最大收益
	 */
	public int maxProfit(int[] prices) 
		int[] buy1 = new int[prices.length];
		int[] sell1 = new int[prices.length];
		int[] buy2 = new int[prices.length];
		int[] sell2 = new int[prices.length];
		buy1[0] = -prices[0];
		sell1[0] = 0;
		buy2[0] = -prices[0];
		sell2[0] = 0;
		for (int i = 1; i < prices.length; i++) 
			// -prices[i]表示在第i天进行第一次买入后的剩余资金,若剩余资金少于前i-1天内剩余资金的最大值,则说明在第i天进行第一次买入不是最优选择,最优解沿用前i-1天的
			buy1[i] = Math.max(buy1[i - 1], -prices[i]); 
			sell1[i] = Math.max(sell1[i - 1], buy1[i] + prices[i]);
			buy2[i] = Math.max(buy2[i - 1], sell1[i] - prices[i]);
			sell2[i] = Math.max(sell2[i - 1], buy2[i] + prices[i]);
		
		printArray(buy1);
		printArray(sell1);
		printArray(buy2);
		printArray(sell2);
		return sell2[prices.length - 1];
	

	public static void main(String[] args) 
		BestTimetoBuyAndSellStock3 main = new BestTimetoBuyAndSellStock3();
		int[] prices =  3, 3, 5, 0, 0, 3, 1, 4 ;
		System.out.println("maxProfit:" + main.maxProfit(prices));

	

	private void printArray(int[] arr) 
		StringBuilder sb = new StringBuilder();
		for (int n : arr) 
			sb.append(n).append("\\t");
		
		System.out.println(sb);
	


程序输出:

-3    -3    -3    0    0    0    0    0    
0    0    2    2    2    3    3    4    
-3    -3    -3    2    2    2    2    2    
0    0    2    2    2    5    5    6    
maxProfit:6
 

这种解法不好理解的地方在于,如何证明所得的最优解覆盖了所有场景,这里打印出了计算过程便于理解,简而言之计算矩阵中的每个数(i, j),都是由左上方i * j的矩阵计算得到的。具体分析过程后继再进行补充。

以上是关于LeetCode 123. Best Time to Buy and Sell Stock III的主要内容,如果未能解决你的问题,请参考以下文章

123. Best Time to Buy and Sell Stock leetcode解题笔记

[leetcode]123. Best Time to Buy and Sell Stock III

[leetcode-123-Best Time to Buy and Sell Stock III]

LeetCode123 Best Time to Buy and Sell Stock III

LeetCode123 Best Time to Buy and Sell Stock III

leetcode 123. Best Time to Buy and Sell Stock III ----- java