2025-07-16 20:50:07 +08:00

42 lines
1.8 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package dynamic_programming;
/**
* 题目: 122. 买卖股票的最佳时机 II (maxProfit)
* 描述:给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。
* 在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。
* 返回 你能获得的 最大 利润 。
* 示例 1
* 输入prices = [7,1,5,3,6,4]
* 输出7
* 解释:在第 2 天(股票价格 = 1的时候买入在第 3 天(股票价格 = 5的时候卖出, 这笔交易所能获得利润 = 5 - 1 = 4。
* 随后,在第 4 天(股票价格 = 3的时候买入在第 5 天(股票价格 = 6的时候卖出, 这笔交易所能获得利润 = 6 - 3 = 3。
* 最大总利润为 4 + 3 = 7 。
* 链接https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii/
*/
//不会dp做法
//二刷会做
public class MaxProfit2 {
// 由于允许多次交易,「今天买入」的收益要在「昨天不持有」的基础上减去今天的价格;「今天卖出」的收益要在「昨天持有」的基础上加上今天的价格。
// dp[i][0]第i天持有股票时的最大收益
//dp[i][1]第i天不持有股票时的最大收益
public int maxProfit(int[] prices) {
int n = prices.length;
if (n < 2) return 0;
int[][] dp = new int[n][2];
// 第 0 天
dp[0][0] = -prices[0];
dp[0][1] = 0;
for (int i = 1; i < n; i++) {
// 持有
dp[i][0] = Math.max(dp[i - 1][0], dp[i - 1][1] - prices[i]);
// 不持有
dp[i][1] = Math.max(dp[i - 1][1], dp[i - 1][0] + prices[i]);
}
return dp[n - 1][1];
}
}