70. Climbing Stairs 「爬楼梯」

2019年11月21日 30点热度 0人点赞 0条评论

假设你正在爬楼梯,共有 n 级台阶。

跨出的每一步只可以爬一级或者两级台阶。求你共有多少种不同的方法可以爬到顶部?

提示: 给定的 n 是个正整数。

例一:
输入: 2
输出: 2
解释: 共有 2 种方法爬到顶部。
1. 1 步 + 1 步
2. 2 步

例二:
输入: 3
输出: 3
解释: 共有 3 种方法爬到顶部。
1. 1 步 + 1 步 + 1 步
2. 1 步 + 2 步
3. 2 步 + 1 步

这个题是一个典型的动态规划题。仔细思考会发现,从第三个台阶开始,对于任意一个台阶,只有两个路径可以一步到达,即跨一步或跨两步。而对于这个台阶来说,总共可以到达它的路径的数量就可以表示为它前面两个台阶的路径的和。想通了这一点,这个题就变成了一个斐波那契数列问题。

/*
 * 70. Climbing Stairs
 * https://leetcode.com/problems/climbing-stairs/
 * https://realneo.me/70-climbing-stairs/
 */

public class ClimbStairs {
    public static void main(String[] args) {
        ClimbStairs solution = new ClimbStairs();

        System.out.println(solution.climbStairs(5));
        System.out.println(solution.climbStairs(10));
    }

    private int climbStairs(int n) {
        if (n == 1) return 1;
        if (n == 2) return 2;

        int[] step = new int[n + 1];
        step[0] = 0;step[1] = 1;step[2] = 2;
        for (int i = 3; i <= n; i++)
            step[i] = step[i - 1] + step[i - 2];

        return step[n];
    }
}

Neo

与卿再世相逢日,玉树临风一少年。

文章评论