面向小白的力扣122. 买卖股票的最佳时机 II-动态规划

108 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第14天,点击查看活动详情

今天,我们继续搞算法。

题目描述

给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。

在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。

返回 你能获得的 最大 利润 。

image.png

题目分析

啥度不会的话,就写个解叭.

image.png

然后,我们开始分析,输入参数是一个数组,数组里是啥呢?是每天的交易股票的价格,因为每天的价格度在变,所以我们选择股票的策略度是不同的,我们一共有这么三种策略要么买,买什么时候买呢?股票跌的时候,要么卖,卖是什么时候卖呢?就是涨的时候,或者不动。那么这个每天的股票的价格可以当成一个状态,因为是变化的。

那我们就想第i天,我们怎么交易?由于题目要求我们持仓数是只能有1个,因此,我们就得关注仓位,我们的仓位也有两个状态,要么持仓,要么空仓,我们可以用0代表空仓,1代表持仓。那我们就需要一个二维数组表示第i天我们的收益,我们的收益计算如下:

  1. 第i天买入股票:f[i][1] = max(f[i][1],f[i-1][0]-prices[i])
  2. 第i天卖出股票:f[i][0] = max(f[i][0],f[i-1][1]+prices[i])
  3. 第i天不动: f[i][j] = max(f[i][j],f[i-1][j])

代码如下

class Solution {
   public int maxProfit(int[] prices) {
        int[] tempPrices = new int[prices.length+1];
        int n = prices.length;
        tempPrices[0] = 0;
        for (int i = 0; i < n; i++) {
            tempPrices[i+1] = prices[i];
        }

        int[][] f = new int[n+1][2];
        for (int i = 0; i < f.length; i++) {
            f[i][0] = (int)-1e9;
            f[i][1] = (int)-1e9;
        }
        f[0][0] = 0;
        for (int i = 1; i <= n; i++) {
            f[i][1] = Math.max(f[i][1], f[i - 1][0] - tempPrices[i]);
            f[i][0] = Math.max(f[i][0], f[i - 1][1] + tempPrices[i]);
            for (int j=0;j<2;j++){
                f[i][j] = Math.max(f[i][j], f[i - 1][j] );
            }
        }
        return f[n][0];
    }
}