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

LeetCode爬楼梯算法仅n=43/45报错,求原因分析

爬楼梯代码在n=43和45时出错的原因及修复方案

你的代码核心思路是对的——通过统计使用i次2步的场景数(即从n-i个位置中选i个放2步,对应组合数C(n-i, i)),再累加所有可能的i值加上全走1步的情况。但在n=43、45时出错,问题出在浮点数精度丢失。

错误原因

当n增大到43、45时,阶乘的计算结果会远超双精度浮点数的精确表示范围(双精度浮点数仅能精确表示2^53以内的整数)。比如:

  • 43! 的值是60415263063373835637355132068513997507264512000000000,这个数远大于2^53(约9e15),用浮点数存储时会被近似处理,丢失末尾的精确数位。
  • 你在permutasyon函数中返回的是浮点数(faktoriyel(a)/faktoriyel(a-b)),后续除以faktoriyel(i)再转int时,因为浮点数已经是近似值,转整数会得到错误的结果,最终导致累加总和偏离正确值。

比如n=43,i=21时,组合数C(43-21,21)=C(22,21)=22,但用你的代码计算时,浮点数的近似误差会让结果偏离,进而影响最终总和。

修复方案

避免用浮点数计算组合数,直接用整数运算,或者利用Python内置的组合数函数math.comb(Python 3.10及以上版本支持),它会用整数运算保证精度。

方案1:使用内置math.comb

import math
class Solution:
    def climbStairs(self, n: int) -> int:
        total = 1  # 初始为全走1步的情况
        max_two_steps = n // 2
        for i in range(1, max_two_steps + 1):
            # 直接计算组合数C(n-i, i),整数运算无精度丢失
            total += math.comb(n - i, i)
        return total

方案2:手动实现整数版组合数(兼容低Python版本)

class Solution:
    def climbStairs(self, n: int) -> int:
        def comb(a, b):
            if b > a - b:
                b = a - b  # 利用组合数性质C(a,b)=C(a,a-b)减少计算量
            result = 1
            for i in range(1, b+1):
                # 先乘后除保证每一步都是整数,避免精度损失
                result = result * (a - b + i) // i
            return result
        
        total = 1
        max_two_steps = n // 2
        for i in range(1, max_two_steps + 1):
            total += comb(n - i, i)
        return total

验证

修正后的代码在n=43时返回433494437,n=45时返回1134903170,均为正确的斐波那契数(爬楼梯问题本质对应斐波那契数列,f(n)=f(n-1)+f(n-2),f(1)=1,f(2)=2)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 23:25:59