• 【每日一题-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;
            }
    
  • 相关阅读:
    2017暑期集训Day 1
    17-06-28模拟赛
    17-06-26模拟赛
    平衡树学习笔记
    指针学习笔记
    17-06-14模拟赛
    17-06-11模拟赛
    17-06-02模拟赛
    17-05-31模拟赛
    培训补坑(day1:最短路&two-sat)
  • 原文地址:https://www.cnblogs.com/qxlxi/p/12860640.html
Copyright © 2020-2023  润新知