Python每日温度问题双指针解法输出异常,求错误原因
每日温度问题:双指针解法错误分析与修正
核心错误点
- 混淆计算目标:题目要求返回的是「等待的天数」,即第一个更高温度的位置与当前位置的索引差
r - l,但你的代码计算的是温度差值,完全不符合需求。 - 双指针移动逻辑错误:当
temperatures[r]不大于temperatures[l]时,你直接同时移动l和r,这导致你跳过了后续可能存在的更高温度。比如输入中的75(索引2),你在r=3(71)时就直接移动l到3,错过了后面索引6的76,这才是正确的匹配项。 - 结果数组不完整:输入数组长度为8,但你的循环只生成了7个元素,最后一个位置(索引7)没有处理,而根据题目要求,该位置的结果必然是0。
修正后的双指针解法(O(n²)时间复杂度)
如果坚持使用双指针思路,正确的逻辑是对每个位置l,从l+1开始向后遍历,直到找到第一个更高的温度,记录索引差;若遍历到末尾都没找到,保持结果为0:
class Solution(object): def dailyTemperatures(self, temperatures): n = len(temperatures) res = [0] * n # 初始化结果数组,默认值为0 for l in range(n): # 从当前位置的下一个开始寻找更高温度 for r in range(l + 1, n): if temperatures[r] > temperatures[l]: res[l] = r - l break # 找到第一个符合条件的就停止遍历 return res
更高效的单调栈解法(O(n)时间复杂度)
双指针解法在最坏情况(如严格递减数组)下时间复杂度为O(n²),而单调栈可以线性时间解决问题:通过栈存储未找到更高温度的索引,遍历数组时匹配并计算天数差:
class Solution(object): def dailyTemperatures(self, temperatures): n = len(temperatures) res = [0] * n stack = [] # 栈中存储索引,对应温度保持单调递增 for r in range(n): # 当前温度高于栈顶索引的温度,说明找到了栈顶元素的目标天数 while stack and temperatures[r] > temperatures[stack[-1]]: l = stack.pop() res[l] = r - l stack.append(r) return res
测试输入temperatures = [73,74,75,71,69,72,76,73]时,上述两种解法都会返回预期结果[1,1,4,2,1,1,0,0]。
内容的提问来源于stack exchange,提问作者vilnius19
相关产品推荐
相关产品推荐

