68.买卖股票的最佳时机

97 阅读1分钟

day16: 121. 买卖股票的最佳时机 (简单)

思路:

  • 借用动态规划思路: 初始化表格全部为二维表格,我们只填充表格的一半,因为每次需要保证时间不能往回减(j=i+1),而且要保证第二天的本金足够才能够继续投钱(p2-p1>0),将利润结果存入数组中。 举得几个例子和自己随便写的几个测试用例结果都是对的,只是数据量过大时会报超出内存限制错误。
  • 动态规划:每过一天就求以此最低的买入价格和卖出价格,到最后自然就是可得的利润。

image.png

第一种:

var maxProfit = function (prices) {
  let n = prices.length;
  let dp = new Array(n).fill(0).map(() => new Array(n).fill(0));
  dp[0][0] = 0;
  let result = 0;
  for (let i = 0; i < n; i++) {
    let p1 = prices[i];
    //保证不会往回减
    for (let j = i + 1; j < n; j++) {
      let p2 = prices[j];
      //第二天的钱比第一天多
      if (p2 - p1 > 0) {
        dp[i + 1][j] = p2 - p1;
        result = Math.max(result, dp[i + 1][j]);
      }
    }
  }
  console.log(dp);
  return result;
};

第二种:

function maxProfit1(prices) {
  let buy = prices[0],
    sell = 0;
  for (let i = 0; i < prices.length; i++) {
    //求买入最低价时多少
    buy = Math.min(buy, prices[i]);
    //price-买入价格和当前销售价格比,求最大值,max即为最终答案
    sell = Math.max(sell, prices[i] - buy);
  }
  return sell;
}

好吧,第二种不需要额外的大量的存储空间,空间复杂度当然比我写的优化很多。第一种主要浪费在表格的初始化上面。