zoukankan      html  css  js  c++  java
  • 【每日一题-leetcode】70.爬楼梯

    70.爬楼梯

    1. 爬楼梯

    难度简单943

    假设你正在爬楼梯。需要 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 阶
    

    1.递归

    时间复杂度:O(2^n)

    空间复杂度:O(n)

    //暴力破解
        public int climbStairs(int n) {
            return climbStairs(0,n);
        }
    
        // i记录当前阶数  n代表目标阶数
        public int climbStairs(int i,int n){
            if(i>n){
                return 0;
            }
            if(i == n){
                return 1;
            }
            return climbStairs(i+1,n)+climbStairs(i+2,n);
        }
    

    2.记忆化递归

    可以看到第一种解法 会出现重复计算。

    时间复杂度:O(n)

    空间复杂度: O(n)

       //记忆化递归
            public int climbStairs(int n) {
                int [] memo = new int [n+1];
                return climbStairs(0,n,memo);
            }
        
            public int climbStairs(int i,int n,int [] memo){
                if(i>n){
                    return 0;
                }
                if(i == n){
                    return 1;
                }
                if(memo[i]>0){
                    return memo[i];
                }
                memo[i] = climbStairs(i+1,n,memo)+climbStairs(i+2,n,memo);
                return memo[i];
            }
    

    3.动态规划

    time : O(n)

    space:O(n)

    用一个数组存储 n阶需要的步数,自底向上编程,先求出最开始的 一步一步向上求解。而递归虽然直接求解的是n阶的所需要的步数,但是由于不断地递归调用自身,也就先求解出最小的阶数,一步一步向上求解。

     //动态规划  ->自底向上编程
            public int climbStairs(int n) {
                if( n ==  1) 
                    return 1;
                int [] dp = new int [n+1];
                dp[1] =  1;
                dp[2] =  2;
                for(int i=3;i<=n;i++){
                    dp[i] = dp[i-1] + dp[i-2];
                }
                return dp[n];
            }
    

    4.斐波那契数列

    时间复杂度:O(n)

    空间复杂度:O(1)

       //斐波那契数列
            public int climbStairs(int n) {
                if(n == 1){
                    return 1;
                }
                int first = 1;
                int second = 2;
                int third = 0;
                for(int i=3;i<=n;i++){
                    third = first + second; // 1 + 2
                    first = second; // 2
                    second = third; // 3
                }
                return second;
            }
    
  • 相关阅读:
    Code Forces 650 C Table Compression(并查集)
    Code Forces 645B Mischievous Mess Makers
    POJ 3735 Training little cats(矩阵快速幂)
    POJ 3233 Matrix Power Series(矩阵快速幂)
    PAT 1026 Table Tennis (30)
    ZOJ 3609 Modular Inverse
    Java实现 LeetCode 746 使用最小花费爬楼梯(递推)
    Java实现 LeetCode 745 前缀和后缀搜索(使用Hash代替字典树)
    Java实现 LeetCode 745 前缀和后缀搜索(使用Hash代替字典树)
    Java实现 LeetCode 745 前缀和后缀搜索(使用Hash代替字典树)
  • 原文地址:https://www.cnblogs.com/qxlxi/p/12860640.html
Copyright © 2011-2022 走看看