小哆啦的解题冒险故事:买卖股票的最佳时机

小哆啦开始力扣每日一题的第五天

121. 买卖股票的最佳时机 - 力扣(LeetCode)

小哆啦的解题冒险故事:买卖股票的最佳时机

在一个安静的编程下午,小哆啦的朋友小明正为一道编程题苦恼。这道题的名字是《买卖股票的最佳时机》,看起来并不复杂,却让小明头疼不已。


初出茅庐的小哆啦

“小哆啦!”小明急匆匆跑来,“这题我试了好多种办法,可是代码运行太慢了,总是超时!”

“别急,别急。”小哆啦打开了自己的小本本,开始分析题目。
“嗯,让我试试看!我们可以尝试遍历所有可能的买卖组合,找出其中的最大利润。”

于是,小哆啦写下了他第一个版本的代码:

function maxProfit(prices: number[]): number {
    let temp = 0;
    for (let i = 1; i < prices.length; i++) {   // 卖出时间
        for (let j = 0; j < i; j++) {           // 买入时间
            temp = temp > prices[i] - prices[j] ? temp : prices[i] - prices[j];
        }
    }
    return temp;
}

“小明,这段代码会计算所有买入和卖出的组合,总能找到最大利润!”

小明兴奋地运行了一下程序,结果……超时了。

“唉,遍历这么多组合,时间复杂度是 O(n2),数据一大就扛不住了。”小哆啦皱了皱眉,“看来这代码需要优化!”


初露锋芒的小哆啦

小哆啦并没有气馁,他拿出他的魔法竹笋笔,开始仔细思考:

“买股票只需要知道两件事:最低买入价格最大卖出利润。”
“我们不用比较所有组合,只需记录一个最低买入价格,然后每一天算一下如果今天卖出,能赚多少钱!”

说干就干,小哆啦重新设计了算法:


优化的解法:一次遍历
  1. 初始化两个变量:

    • minPrice:一开始设为无穷大,因为我们还没有看到任何价格。
    • maxProfit:一开始设为 0,因为尚未有交易。
  2. 遍历价格数组:

    • 每天更新最低价格 minPrice
    • 每天计算以当前价格卖出的利润,并更新 maxProfit

小哆啦写下了优化版代码:

function maxProfit(prices: number[]): number {
    let minPrice = Infinity; // 初始化最低买入价格
    let maxProfit = 0;       // 初始化最大利润

    for (let price of prices) {
        minPrice = Math.min(minPrice, price);     // 更新最低价格
        maxProfit = Math.max(maxProfit, price - minPrice); // 更新最大利润
    }

    return maxProfit;
}

成功的喜悦

小明再次运行代码,结果瞬间就出来了!

“快看,时间复杂度从 O(n2) 优化到了 O(n),运行速度快得多!”小明欢呼起来,“小哆啦,你真是太厉害了!”


小哆啦的冒险感悟

小哆啦微微一笑,“优化代码就像一场冒险,不断寻找更高效的解决方案。记住,把握住问题的核心,就能找到最快的路!”

从那以后,小哆啦的优化故事成为了编程圈里的传说,而小明也学会了如何用更聪明的方法解决问题。他们俩继续并肩作战,在算法的世界里书写更多冒险篇章!

你可能感兴趣的:(力扣每日一题,算法)