Skip to content

算法训练营 Day 49 | 123.买卖股票的最佳时机III ● 188.买卖股票的最佳时机IV  #47

Description

@KoEkko

123.买卖股票的最佳时机III

这次股票至多只能买2次,所以当天有5种状态

  1. 不操作 dp[i][0]
  2. 第一次持有 dp[i][1]
  3. 第一次不持有 dp[i][2]
  4. 第二次持有 dp[i][3]
  5. 第三次不持有 dp[i][4]

思路跟之前的差不多,就是在初始化的时候,需要注意:
在第0天的时候,
dp[0][1] = -prices[0];
dp[0][2] = 0;
dp[0][3] = -prices[0];
dp[0][4] = 0;
就是相当于当天买入卖出

function maxProfit(prices: number[]): number {
  const length = prices.length;
  if (length === 0) return 0;
  const dp: number[][] = new Array(length)
    .fill(0)
    .map((_) => new Array(5).fill(0));
  dp[0][1] = -prices[0];
  dp[0][3] = -prices[0];
  for (let i = 1; i < length; i++) {
    dp[i][1] = Math.max(dp[i - 1][1], -prices[i]);
    dp[i][2] = Math.max(dp[i - 1][2], dp[i - 1][1] + prices[i]);
    dp[i][3] = Math.max(dp[i - 1][3], dp[i - 1][2] - prices[i]);
    dp[i][4] = Math.max(dp[i - 1][4], dp[i - 1][3] + prices[i]);
  }
  return Math.max(dp[length - 1][2], dp[length - 1][4]);
}

188.买卖股票的最佳时机IV

通过几道题,发现奇数次的时候是持有股票,偶数次的时候是不持有股票。
第0天持有股票都是 -prices[0];

function maxProfit(k: number, prices: number[]): number {
  if (k === 0 || prices === null || prices.length < 2) return 0;
  const length = prices.length;
  const dp: number[][] = new Array(length)
    .fill(0)
    .map((_) => new Array(2 * k + 1).fill(0));
  for (let j = 1; j < 2 * k; j += 2) {
    dp[0][j] = -prices[0];
  }
  for (let i = 1; i < length; i++) {
    for (let j = 0; j < 2 * k + 1; j++) {
      dp[i][j + 1] = Math.max(dp[i - 1][j + 1], dp[i - 1][j] - prices[i]);
      dp[i][j + 2] = Math.max(dp[i - 1][j + 2], dp[i - 1][j + 1] + prices[i]);
    }
  }
  return dp[length - 1][2 * k];
}

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions