zoukankan      html  css  js  c++  java
  • 算法题之Climbing Stairs(leetcode 70)

    题目:

    You are climbing a stair case. It takes n steps to reach to the top.

    Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?

    Note: Given n will be a positive integer.

    Approach #1 Brute Force [Time Limit Exceeded]

    public class Solution {
        public int climbStairs(int n) {
            climb_Stairs(0, n);
        }
        public int climb_Stairs(int i, int n) {
            if (i > n) {
                return 0;
            }
            if (i == n) {
                return 1;
            }
            return climb_Stairs(i + 1, n) + climb_Stairs(i + 2, n);
        }
    }
    

    Time complexity : O(2^n). Size of recursion tree will be 2^n​​.

    Space complexity : O(n). The depth of the recursion tree can go upto n.

    Approach #2 Recursion with memorization [Accepted]

    public class Solution {
        public int climbStairs(int n) {
            int memo[] = new int[n + 1];
            return climb_Stairs(0, n, memo);
        }
        public int climb_Stairs(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] = climb_Stairs(i + 1, n, memo) + climb_Stairs(i + 2, n, memo);
            return memo[i];
        }
    }

    Time complexity : O(n). Size of recursion tree can go upto n.

    Space complexity : O(n). The depth of recursion tree can go upto n.

    Approach #3 Dynamic Programming [Accepted]

    public class Solution {
        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];
        }
    }
    

    Time complexity : O(n). Single loop upto n.

    Space complexity : O(n). dp array of size n is used.

    Approach #4 Fibonacci Number [Accepted]:

    public class Solution {
        public int climbStairs(int n) {
            if (n == 1) {
                return 1;
            }
            int first = 1;
            int second = 2;
            for (int i = 3; i <= n; i++) {
                int third = first + second;
                first = second;
                second = third;
            }
            return second;
        }
    }
    

    Time complexity : O(n). Single loop upto n is required to calculate n^{th} fibonacci number.

    Space complexity : O(1). Constant space is used.

    原文:https://leetcode.com/articles/climbing-stairs/

  • 相关阅读:
    学习视频收集
    vscode 编译器插件
    vue2.0父子组件之间传值
    js 案例
    插件
    【转】30分钟掌握 C#6
    【初码干货】关于.NET玩爬虫这些事
    上机作业七 系统进程与计划任务管理
    客户端与服务器双向密钥对验证
    DHCP中继配置
  • 原文地址:https://www.cnblogs.com/shixiangwan/p/6735832.html
Copyright © 2011-2022 走看看