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/

  • 相关阅读:
    606. Construct String from Binary Tree
    696. Count Binary Substrings
    POJ 3255 Roadblocks (次短路)
    POJ 2823 Sliding Window (单调队列)
    POJ 1704 Georgia and Bob (博弈)
    UVa 1663 Purifying Machine (二分匹配)
    UVa 10801 Lift Hopping (Dijkstra)
    POJ 3281 Dining (网络流之最大流)
    UVa 11100 The Trip, 2007 (题意+贪心)
    UVaLive 4254 Processor (二分+优先队列)
  • 原文地址:https://www.cnblogs.com/shixiangwan/p/6735832.html
Copyright © 2011-2022 走看看