小哆啦开始力扣每日一题的第六天
小哆啦的解题冒险故事:买卖股票的最佳时机
在一个安静的编程下午,小哆啦的朋友小明正为一道编程题苦恼。这道题的名字是《买卖股票的最佳时机》,看起来并不复杂,却让小明头疼不已。
初出茅庐的小哆啦
“小哆啦!”小明急匆匆跑来,“这题我试了好多种办法,可是代码运行太慢了,总是超时!”
“别急,别急。”小哆啦打开了自己的小本本,开始分析题目。
“嗯,让我试试看!我们可以尝试遍历所有可能的买卖组合,找出其中的最大利润。”
于是,小哆啦写下了他第一个版本的代码:
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),数据一大就扛不住了。”小哆啦皱了皱眉,“看来这代码需要优化!”
初露锋芒的小哆啦
小哆啦并没有气馁,他拿出他的魔法竹笋笔,开始仔细思考:
“买股票只需要知道两件事:最低买入价格和最大卖出利润。”
“我们不用比较所有组合,只需记录一个最低买入价格,然后每一天算一下如果今天卖出,能赚多少钱!”
说干就干,小哆啦重新设计了算法:
优化的解法:一次遍历
-
初始化两个变量:
minPrice:一开始设为无穷大,因为我们还没有看到任何价格。maxProfit:一开始设为 0,因为尚未有交易。
-
遍历价格数组:
- 每天更新最低价格
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),运行速度快得多!”小明欢呼起来,“小哆啦,你真是太厉害了!”
小哆啦的冒险感悟
小哆啦微微一笑,“优化代码就像一场冒险,不断寻找更高效的解决方案。记住,把握住问题的核心,就能找到最快的路!”
从那以后,小哆啦的优化故事成为了编程圈里的传说,而小明也学会了如何用更聪明的方法解决问题。他们俩继续并肩作战,在算法的世界里书写更多冒险篇章!