计算大立方体内子长方体数量的Python代码为什么出现超时错误?
子长方体计数代码优化方案
现有代码的核心问题如下:
- 三重嵌套循环的时间复杂度为O(xyz),当输入参数大于100时,运算量就会突破百万级,参数更大时直接触发超时
- 使用列表推导式生成所有abc的结果再求和,会额外占用大量内存存储中间列表,进一步降低运行效率
- 若你实际运行的代码将print语句写在了循环内部,频繁的IO操作也会大幅增加耗时,甚至出现每次迭代都输出中间求和值的情况
这类几何计数问题可以直接用数学公式实现O(1)复杂度计算,完全不需要遍历所有组合:
对于长度为n的一维线段,所有可能的子线段总数为
n*(n+1)//2;三维长方体的子长方体总数,等于长宽高三个维度各自的子线段总数的乘积。
优化后的代码如下:
def subcuboids(x, y, z): # 计算单个维度的子线段总数 def count_1d(n): return n * (n + 1) // 2 total = count_1d(x) * count_1d(y) * count_1d(z) print(total) return total
测试用例验证:输入subcuboids(2,2,2)时,计算逻辑为3*3*3=27,和预期结果完全匹配。
如果因特殊需求必须保留遍历逻辑(比如教学演示场景),可以将列表推导式改为生成器表达式,去掉方括号即可,避免生成完整的中间列表,能一定程度降低内存开销:
def subcuboids(x,y,z): cuboid = sum(a * b * c for a in range(x, 0, -1) for b in range(y, 0, -1) for c in range (z, 0 , -1)) print(cuboid)
内容的提问来源于stack exchange,提问作者Richard
相关产品推荐
相关产品推荐

