leetcode 70、爬楼梯问题

动态规划解爬楼梯问题

问题描述

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

解题思路

这个问题跟取石子是相同的,很自然想到动态规划。
设,爬到楼顶共有f(n)种方法,共有n阶台阶(n阶台阶,f(n)种方法),想要爬完最后一阶楼梯前,可以是剩下最后一阶台阶,或者是剩下最后两阶。如果是剩下一阶,则应该有f(n-1)种方法(保持映射关系,n-1阶台阶,f(n-1)种方法);如果剩下最后两阶,则应该有f(n-2)种方法。因为爬完n-1和爬完n-2是两种不同方式,为了爬完n阶楼梯,这是可以叠加的,即 f(n) = f(n-1) + f(n-2);这便是状态转移公式,公式的出口应该是 f(0) = 1 和 f(1) = 1;由此可以创建一个数组用于存放每个f(n)的值,即n阶楼梯对应的方法总数。

代码:

public class ClimbingStairs {
    public static void main(String[] args) {
        System.out.println(climbStairs(5));
    }
    public static int climbStairs(int n) {//方法参数n为楼梯数
        int[] ans = new int[n+1];//用于存放方法数,f(n)即最后爬完n阶楼梯的方法总数
        ans[0] = 1;
        ans[1] = 1;
        for (int i = 2; i < n + 1; i++) {
            ans[i] = ans[i-1] + ans[i-2];
        }
        return ans[n];//返回方法总数
    }
}

因为只有一个for循环,所以时间复杂度为O(n)。

猜你喜欢

转载自blog.csdn.net/TreeCode/article/details/106740088