質問35-2つの株式取引の最大収益

オリジナルタイトルリンク

タイトル説明

假定你知道某只股票每一天价格的变动。
你最多可以同时持有一只股票。但你最多只能进行两次交易(一次买进和一次卖出记为一次交易。买进和卖出均无手续费)。
请设计一个函数,计算你所能获得的最大收益。

输入:
[8,9,3,5,1,3]
输出:
4

リファレンスソリューション

リファレンスブログ

public class Test {
    
    

	public static void main(String[] args) {
    
    
		int a[] = {
    
     6, 10, 22, 5, 75, 65, 80 };
		System.out.println(maxProfit(a));
	}

	// 相当于把数组分成左右两部分,求左边最大值+右边最大值的和的最大值
	public static int maxProfit(int[] prices) {
    
    

		int length = prices.length;

		// dp1[i]存储从0到i天交易一次的最大利润
		int dp1[] = new int[length];
		dp1[0] = 0;
		int minPrice = prices[0];

		for (int i = 1; i < length; i++) {
    
    
			dp1[i] = Math.max(prices[i] - minPrice, dp1[i - 1]);
			if (prices[i] < minPrice)
				minPrice = prices[i];
		}

//		for (int i = 0; i < dp1.length; i++) {
    
    
//			System.out.printf("%d ", dp1[i]);
//		}
//		System.out.println();

		int[] dp2 = new int[length];
		dp2[length - 1] = 0;
		int maxPrice = prices[length - 1];

		// dp2[i]存储从i到 price.length 天交易一次的最大利润
		for (int i = length - 2; i >= 0; i--) {
    
    
			dp2[i] = Math.max(maxPrice - prices[i], dp2[i + 1]);
			if (prices[i] > maxPrice)
				maxPrice = prices[i];
		}

//		for (int i = 0; i < dp2.length; i++) {
    
    
//			System.out.printf("%d ", dp2[i]);
//		}
//		System.out.println();

		int max = 0;
		for (int i = 0; i < length; i++) {
    
    
			max = Math.max(max, dp1[i] + dp2[i]);
		}
		return max;
	}
}

おすすめ

転載: blog.csdn.net/Awt_FuDongLai/article/details/109695556