前言

最近在练习动态规划的题目,然后就随便选择了一道简单的题目——爬楼梯,题目如下:

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。

示例 1:

输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
1.  1 阶 + 1 阶
2.  2 阶

示例 2:

输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
1.  1 阶 + 1 阶 + 1 阶
2.  1 阶 + 2 阶
3.  2 阶 + 1 阶

解题思路

这道题目虽然分类是动态规划,但是实际上就是个斐波那契数列,不过是一个当入参为n时,需对应的是斐波那契数列的f(n+1)
斐波那契数列:

f(0)=0
f(1)=1
f(2)=f(1)+f(0)=1
f(3)=f(2)+f(1)=2
f(4)=f(3)+f(2)=3
f(5)=f(4)+f(3)=5
f(6)=f(5)+f(4)=8
f(7)=f(6)+f(5)=13

爬楼梯:

c(0)=f(0)=0
c(1)=f(0)+f(1)=f(2)=1
c(2)=f(1)+f(2)=f(3)=2
c(3)=f(2)+f(3)=f(4)=3
c(4)=f(3)+f(4)=f(5)=5
c(5)=f(4)+f(5)=f(6)=8
c(6)=f(5)+f(6)=f(7)=13

实现代码

    /**
     * 爬楼梯
     * @param n
     * @return
     */
    public int climbStairs(int n) {
        if(n==1){
            return 1;
        }else if(n==2){
            return 2;
        }else{
            int f1 = 1;
            int f2 = 2;
            int result = 0;
            for (int i = 3; i <=n; ++i){
                result=f1+f2;
                f1 = f2;
                f2 = result;
            }
            return result;
        }
    }

Null
137 声望31 粉丝

免费的东西是最贵的,好走的只是下坡路