You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LeetCode找方程正整数解:双重循环超时,单循环+while为何通过?

为什么双重循环超时,单循环+while却能通过LeetCode这道题?

我在解决LeetCode题目《Find Positive Integer Solution for a Given Equation》时,写出了一段双重循环代码,但提交后超时;另一种单for循环结合while循环的解法却能正常通过。两种写法逻辑看似一致,想请教为何我的代码会超时?

我的超时代码:

res = []
for x in range(1,1001):
    for y in range(1000,0,-1):
        test = customfunction.f(x,y)
        if test == z:
            res.append([x,y])
return res

通过的解法:

def findSolution(self, customfunction, z):
    res = []
    y = 1000
    for x in range(1, 1001):
        while y > 1 and customfunction.f(x, y) > z:
            y -= 1
        if customfunction.f(x, y) == z:
            res.append([x, y])
    return res

核心原因:利用函数单调性大幅减少调用次数

这道题的关键隐藏条件是**customfunction.f(x,y)是关于x和y的单调递增函数**——当x固定时,y越大,f(x,y)的值越大;当y固定时,x越大,f(x,y)的值也越大。

你的双重循环完全没利用这个特性:每个x都从y=1000遍历到1,最坏情况下要调用f函数1000*1000=100万次,这很容易触发时间限制。

而通过的解法充分利用了单调性:

  • 初始时y从1000开始,随着x递增(x从1到1000),满足f(x,y)=z的y值只会变小或不变(因为x变大后,要让f(x,y)等于z,y不能比之前更大)。
  • 所以y只需要从当前位置往下调整,不需要每次都从1000重新遍历。整个过程中,f函数的调用次数最多是1000(x的循环次数)+1000(y最多从1000减到1的次数)=2000次,远小于100万次,自然不会超时。

内容的提问来源于stack exchange,提问作者DrNogNog

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 15:48:06