121. 买卖股票的最佳时机

力扣的 121 题: 使用 js 解题


题目要求:

给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。

如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。

注意:你不能在买入股票前卖出股票。

示例 1:

输入: [7,1,5,3,6,4]
输出: 5
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
     注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。

就是你要先买入,后才能卖出;


示例 2:

输入: [7,6,4,3,1]
输出: 0
解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。

如果亏了,就不进行买卖,利润为 0;


错误
首先自己做的时候,以为 找出数组的最大值 和 最小值,然后用 最大值 减 最小值,就可以得出 最大的总利润,之后发现是错误的;


以第一个为例:
不能单纯的找出最小值 和 最大值; [2,4,1],这个就不能得出 最大利润,如果找到最大值 - 最小值,2 - 1 = 1;但这个股票的最大利润就为: 4 - 2 = 2
在这里插入图片描述
我们可以用当前的 值 减去 他左侧的最小值,就可以得出 卖出股票时,所得的利润了。
比如说:

当前为 7,他的左侧最小值也为 7, 7 - 7 = 0;
当前为 1,他的左侧最小值也为 1, 1 - 1 = 0;
当前为 5,他的左侧最小值也为 1, 5 - 1 = 4;
当前为 3,他的左侧最小值也为 1, 3 - 1 = 2;
当前为 6,他的左侧最小值也为 1, 6 - 1 = 5;
当前为 4,他的左侧最小值也为 1, 4 - 1 = 3;

我们可以看得出来,如果在 1 的时候买入,6 的时候卖出就可以得到 最大的利润 5;

我们就可以写代码了:

我们还是以 [7,6,4,3,1] 为例

var maxProfit = function(prices) {
  // 记录左侧的最小值
  let min = 0;
  // 记录总利润
  let profit = 0;

  // 判断长度是否为 0,如果为0,那么就没有利润
  if (prices.length == 0) {
    return 0;
  }

  // 假设数组的第一个值为 最小值
  min = prices[0];  // 7

  // 循环数组 
  for (let i = 0; i < prices.length; i++) {

    // 如果后面有一个值,最小值还小,就把他赋值为最小值
    if (prices[i] < min) {
      min = prices[i];  // 1, 
    }

    // 如果当前的总利润 大于 之前的总利润,就确定他为新的总利润
    if (prices[i] - min > profit) {
      profit = prices[i] - min;
    }
  }

  return profit;
};
当前值715364
prices[i] - min7-7 = 01 - 1 = 05 - 1 = 43 - 1 = 26 - 1 = 54 - 1 = 3
profit004455

参考:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值