[路飞]_程序员必刷力扣题: 买卖股票的最佳时机

「这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战

买卖股票的最佳时机

力扣链接

给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。

你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。

返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。

示例 1:

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

示例 2:

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

提示:

1 <= prices.length <= 105 0 <= prices[i] <= 104

所有结果

思路

买股票我们最直接能想到的就是,把所有结果都列出来,找到最大利润

  • 声明一个max 用来保存最大利润
  • 通过一个双循环第i天买和第j天卖,来找到所有结果,因为买股票卖的动作必须在买的动作之后,所以第二层循环的j = i+1 开始
  • 每天所得利润和max相比,取较大值保存在max中,最后返回max
var maxProfit = function (prices) {
    var max = 0; 
    for (var i = 0; i < prices.length; i++) { 
        for (var j = i + 1; j < prices.length; j++) { 
            max = Math.max(prices[j] - prices[i], max); 
        } 
    } 
    return max
};
复制代码

一次循环

思路

我们知道,我们买股票的时候, 在买完后的每一天我们都能计算得到多少利润。 我们也用一个变量max来存储最大利润。我们希望买入的价格是最低的,我们也需要用一个变量min来保存买入的价格

  • 开始循环,第i天买入,往后每一天的利润就是prices[i] - min。因为买卖最少两天,我们可以从i=1开始遍历,min=第一个的值开始,即min = prices[0]
  • 将每天的利润与max比较,并将较大值保存在max中
  • 如果第i天的价格我们发现比min还要低,我们肯定会后悔,如果我再等一等,并是在今天(i)买入就好了,所以在prices[i] < min 时,我们假设在这一天买入,min = prices[i]
  • 重复以上步骤,最后返回max
var maxProfit = function (prices) {
    var max = 0;
    var min = prices[0];
    for (var i = 1; i < prices.length; i++) {
        var profit = prices[i] - min;
        if(profit>max) max = profit
        if(prices[i]<min) min = prices[i]
    }
    return max
};
复制代码

猜你喜欢

转载自juejin.im/post/7030794575337750558