題目:
給你一個整數數組?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];}
}