只能买卖一次
- class Solution {
- public int maxProfit(int[] prices) {
- int length = prices.length;
- // dp[i][0]代表第i天持有股票的最大收益
- // dp[i][1]代表第i天不持有股票的最大收益
- int[][] dp = new int[length][2];
-
- // 第一天
- dp[0][0] = -prices[0]; // 买 支出了这么多
- dp[0][1] = 0;
- // 第二天开始
- for(int i = 1; i < length; i++){
- // 之前已经买了,还是今天才买
- dp[i][0] = Math.max(dp[i-1][0], -prices[i]); // 持有股票,就要花掉对应的钱
- // 之前已经卖了,还是今天才卖(今天卖意味着昨天已经持有了)
- dp[i][1] = Math.max(dp[i-1][1], dp[i-1][0] + prices[i]); // 卖,收入对应的钱
- }
- return dp[length - 1][1];
- }
- }
可以多次买卖
- class Solution {
- public int maxProfit(int[] prices) {
- int length = prices.length;
- // dp[i][0]代表第i天持有股票的最大收益
- // dp[i][1]代表第i天不持有股票的最大收益
- int[][] dp = new int[length][2];
-
- // 第一天
- dp[0][0] = -prices[0]; // 买 支出了这么多
- dp[0][1] = 0;
- // 第二天开始
- for(int i = 1; i < length; 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[length - 1][1];
- }
- }