【JS每日一算法】🟩115.买卖股票的最佳时机(暴力破解 、一次遍历)

212 阅读1分钟

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

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

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

提示:

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

示例 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

 题解:

个人博客

更多JS版本题解点击链接关注该仓库👀

/**
 * @description: 暴力破解   TC:O(n^2)  SC:O(1)
 * @author: JunLiangWang
 * @param {*} prices 给定数组
 * @return {*}
 */       
function bruteForce(prices){
    /**
     * 该方案使用暴力破解法,利用嵌套遍历数组所有元素
     * 以及与其之后元素的差值,最大的差值即为最大利润
     */

    // 记录最大利润
    let max=0
    // 遍历所有元素
    for(let i=0;i<prices.length;i++)
    {
        // 遍历当前元素之后的元素
        for(let j=i+1;j<prices.length;j++)
        {
           // 计算差值
           let DValue=prices[j]-prices[i]
           // 更新最大差值
           if(DValue>max)max=DValue
        }
    }
    // 返回结果
    return max
}


/**
 * @description: 一次遍历  TC:O(n)  SC:O(1)
 * @author: JunLiangWang
 * @param {*} prices 给定数组
 * @return {*}
 */
function traverseOnce(prices){
    /**
     * 我们可对上述暴力破解进行进一步优化,使用一次遍历
     * 即可得出答案,我们只需要定义一个变量,在遍历过程
     * 中不断记录最小值,然后以此来计算利润差即可
     */

    if(prices.length<2)return 0
    // 初始化最小值为首个元素
    let minPrices=prices[0],
    // 初始化最大利润为0
    maxProfit=0;
    // 从第二个元素开始遍历数组
    for(let i=1;i<prices.length;i++){
        // 如果当前元素为最小值,则更新最小值
        if(prices[i]<minPrices)minPrices=prices[i]
        // 不是,则计算并更新最大利润
        else maxProfit=Math.max(maxProfit,prices[i]-minPrices)
    }
    // 返回最大利润
    return maxProfit;
}