leetcode简单题15 N.70 爬楼梯 rust描述


 

// 2 2
// 3 3
// 45 1836311903 额外加的 纯递归超时了
// 递归加记忆化
pub fn climb_stairs(n: i32) -> i32 {
    fn climb(n: i32, memo: &mut Vec<i32>) -> i32 {
        if n <= 2 {
            return n;
        }
        if memo[n as usize] == 0 {
            memo[n as usize] = climb(n - 1, memo) + climb(n - 2, memo);
        }
        memo[n as usize]
    }

    let mut memo = vec![0; (n + 1) as usize];
    climb(n, &mut memo)
}
// 动态规划
pub fn climb_stairs2(n: i32) -> i32 {
    if n <= 2 {
        return n;
    }

    let mut dp = vec![0; (n + 1) as usize];
    dp[1] = 1;
    dp[2] = 2;

    for i in 3..=n {
        dp[i as usize] = dp[(i - 1) as usize] + dp[(i - 2) as usize];
    }

    dp[n as usize]
}
// 滚动数组
pub fn climb_stairs3(n: i32) -> i32 {
    if n <= 2 {
        return n;
    }

    let (mut a, mut b) = (1, 2);

    for _ in 3..=n {
        let temp = a + b;
        a = b;
        b = temp;
    }

    b
}
fn main() {
    assert_eq!(climb_stairs(2), 2);
    assert_eq!(climb_stairs(3), 3);
    assert_eq!(climb_stairs(45), 1836311903);

    assert_eq!(climb_stairs2(2), 2);
    assert_eq!(climb_stairs2(3), 3);
    assert_eq!(climb_stairs2(45), 1836311903);

    assert_eq!(climb_stairs3(2), 2);
    assert_eq!(climb_stairs3(3), 3);
    assert_eq!(climb_stairs3(45), 1836311903);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值