• 算法题之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/

  • 相关阅读:
    HTML5实现音频播放
    百度编辑器UEditor常用设置函数大全
    .Net一般处理程序来实现用户名的验证
    软件设计师13-数据库设计
    软件设计师12-数据流图
    百度云BCC安装WordPress镜像
    Java获取客户端真实IP地址
    软件设计师11-面向对象技术
    百度云BCC主机宝镜像
    软件设计师10-系统开发模型
  • 原文地址:https://www.cnblogs.com/shixiangwan/p/6735832.html
Copyright © 2020-2023  润新知