题目:
给你一个整数数组 prices
,其中 prices[i]
表示某支股票第 i
天的价格。
在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。
返回 你能获得的 最大 利润 。
- 初始化:
- 如果数组长度小于等于1,直接返回0(无法获利)
hold = -prices
:第一天买入股票,利润为负notHold = 0
:第一天不买股票,利润为0- 遍历每一天(从第二天开始):
- 更新
hold[i]
:hold[i] = Math.max(hold[i - 1], notHold[i - 1] - prices[i])
意味着今天持有股票的最大利润可能来自:
- 昨天就持有股票(
hold[i - 1]
)- 昨天不持有,今天买入(
notHold[i - 1] - prices[i]
)- 更新
notHold[i]
:notHold[i] = Math.max(notHold[i - 1], hold[i - 1] + prices[i])
意味着今天不持有股票的最大利润可能来自:
- 昨天就不持有股票(
notHold[i - 1]
)- 昨天持有,今天卖出(
hold[i - 1] + prices[i]
)
public class no_122 {
public static void main(String[] args) {
int[] price = {1, 2, 3, 4, 5};
System.out.println(maxProfit(price));
}
public static int maxProfit(int[] prices) {
int n = prices.length;
if (n <= 1) return 0;
int[] hold = new int[n];
int[] notHold = new int[n];
hold[0] = -prices[0];
notHold[0] = 0;
for (int i = 1; i < n; i++) {
// 今天持有股票的最大利润 = max(昨天持有,昨天不持有今天买入)
hold[i] = Math.max(hold[i - 1], notHold[i - 1] - prices[i]);
// 今天不持有股票的最大利润 = max(昨天就不持有, 昨天持有今天卖出)
notHold[i] = Math.max(notHold[i - 1], hold[i - 1] + prices[i]);
}
return notHold[n - 1];
}
}