LeetCode70题 爬楼梯(斐波那契数列 递归 动态规划)



问题描述:

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

注意:给定 n 是一个正整数。

示例 1:

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

示例 2:

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

解题思路:

  可以使用动态规划进行求解,dp[i] = dp[i-1] + dp[i-2],dp[i]表示n==i时的方法数。举个例子:能够一步走到第三个台阶的只有第二个台阶和第一个台阶,所以走到第三个台阶的方法数等于走到第一个台阶的方法数加上走到第二个台阶的方法数。得出这个规律后这题和斐波那契数列的解法一模一样。
  注意的是这题虽然可以使用递归的方式进行求解,但是会超时。

代码实现:

public class test79爬楼梯 {
    
    

    public static void main(String[] args) {
    
    
        System.out.println(climbStairs1(3));
    }

    /**
     * 递归的解法(会超时)
     * @param n
     * @return
     */
    public static int climbStairs(int n) {
    
    
        if(n==1) return 1;
        if(n==2) return 2;
        return climbStairs(n-1) + climbStairs(n-2);
    }


    /**
     * 动态规划解法
     * dp[i] 表示n==i时的方法数
     * @param n
     * @return
     */
    public static int climbStairs1(int n) {
    
    
        if(n==1) return 1;
        if(n==2) return 2;
        int[] dp = new int[n+1];
        //初始化dp数组
        dp[1] = 1;
        dp[2] = 2;
        //构建dp数组
        for(int i=3; i<=n; i++){
    
    
            dp[i] = dp[i-1] + dp[i-2];
        }
        return dp[n];
    }

    /**
     * 对动态规划解法进行优化,由于只需要用到第n-1和n-2的记录进行求解
     * 所以可以省略dp数组,通过两个变量进行记录即可
     * @param n
     * @return
     */
    public static int climbStairs2(int n) {
    
    
        if(n==1) return 1;
        if(n==2) return 2;
        int k1 = 1;
        int k2 = 2;
        int res = 0;
        for(int i=3; i<=n; i++){
    
    
            res = k1 + k2;
            k1 = k2;
            k2 = res;
        }
        return res;
    }


}

动态规划解法提交结果:
在这里插入图片描述

优化后的提交结果:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/HC199854/article/details/113624820