Welcome to Subscribe On Youtube

Question

Formatted question description: https://leetcode.ca/all/70.html

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

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

 

Example 1:

Input: n = 2
Output: 2
Explanation: There are two ways to climb to the top.
1. 1 step + 1 step
2. 2 steps

Example 2:

Input: n = 3
Output: 3
Explanation: There are three ways to climb to the top.
1. 1 step + 1 step + 1 step
2. 1 step + 2 steps
3. 2 steps + 1 step

 

Constraints:

  • 1 <= n <= 45

Algorithm

You can only climb 1 or 2 steps at a time, so the method to climb to the nth layer is either from the n-1 layer one step up, or from the n-2 layer 2 steps up, so the recursive formula is very easy We get: dp[n] = dp[n-1] + dp[n-2].

Code

  • 
    public class Climbing_Stairs {
    
    	public class Solution {
    	    public int climbStairs(int n) {
    
    	        if (n <= 0) {
    	            return 0;
    	        }
    
    	        // dp[i], ways to i
    	        int[] dp = new int[n + 1];
    
    	        dp[0] = 1; // to make dp[2] correct when adding up
    	        dp[1] = 1;
    
    	        for (int i = 2; i <= n; i++) {
    	            dp[i] = dp[i - 1] + dp[i - 2];
    	        }
    
    	        return dp[n];
    	    }
    	}
    
    
    	/*
    		Time complexity : O(2^n)
    		Size of recursion tree will be 2^n
     	*/
    	class Solution_recursive_cache {
    		public int climbStairs(int n) {
    			if (n <= 0) {
    				return 0;
    			}
    
    			int[] cache = new int[n + 1];
    			return dfs(n, 0, cache);
    		}
    
    		private int dfs(int n, int current, int[] cache) {
    
    			if (current > n) {
    				return 0;
    			}
    
    			if (current == n) {
    				return 1;
    			}
    
    			if (cache[current] > 0) {
    				return cache[current];
    			}
    
    			int combinations = dfs(n, current + 1, cache) + dfs(n, current + 2, cache);
    			cache[current] = combinations;
    
    			return combinations;
    		}
    	}
    
    
    	/*
    		Time complexity : O(2^n)
    		Size of recursion tree will be 2^n
    
    		ref: https://leetcode.com/problems/climbing-stairs/solution/
    	 */
    	class Solution_recursive {
    		public int climbStairs(int n) {
    			if (n <= 0) {
    				return 0;
    			}
    
    			return dfs(n, 0);
    		}
    
    		private int dfs(int n, int current) {
    
    			if (current > n) {
    				return 0;
    			}
    
    			if (current == n) {
    				return 1;
    			}
    
    			return dfs(n, current + 1) + dfs(n, current + 2);
    		}
    	}
    
    }
    
    ############
    
    class Solution {
        public int climbStairs(int n) {
            int a = 0, b = 1;
            for (int i = 0; i < n; ++i) {
                int c = a + b;
                a = b;
                b = c;
            }
            return b;
        }
    }
    
  • // OJ: https://leetcode.com/problems/climbing-stairs/
    // Time: O(N)
    // Space: O(1)
    class Solution {
    public:
        int climbStairs(int n) {
            int ans = 1, prev = 1;
            while (--n) {
                ans += prev;
                prev = ans - prev;
            }
            return ans;
        }
    };
    
  • class Solution:
        def climbStairs(self, n: int) -> int:
            a, b = 0, 1
            for _ in range(n):
                a, b = b, a + b
            return b
    
    ############
    
    class Solution(object):
      def climbStairs(self, n):
        """
        :type n: int
        :rtype: int
        """
        if n <= 1:
          return 1
        pre, ppre = 1, 1
        for i in range(2, n + 1):
          tmp = pre
          pre = ppre + pre
          ppre = tmp
        return pre
    
    
  • func climbStairs(n int) int {
        a, b := 0, 1
        for i := 0; i < n; i++ {
            a, b = b, a + b
        }
        return b
    }
    
  • function climbStairs(n: number): number {
        let p = 1;
        let q = 1;
        for (let i = 1; i < n; i++) {
            [p, q] = [q, p + q];
        }
        return q;
    }
    
    
  • /**
     * @param {number} n
     * @return {number}
     */
    var climbStairs = function (n) {
        let a = 0,
            b = 1;
        for (let i = 0; i < n; ++i) {
            const c = a + b;
            a = b;
            b = c;
        }
        return b;
    };
    
    
  • class Solution {
        /**
         * @param Integer $n
         * @return Integer
         */
        function climbStairs($n) {
            if ($n <= 2) {
                return $n;
            }
            $dp = [0, 1, 2];
            for ($i = 3; $i <= $n; $i++) {
                $dp[$i] = $dp[$i - 2] + $dp[$i - 1];
            }
            return $dp[$n];
        }
    }
    
  • impl Solution {
        pub fn climb_stairs(n: i32) -> i32 {
            let (mut p, mut q) = (1, 1);
            for i in 1..n {
                let t = p + q;
                p = q;
                q = t;
            }
            q
        }
    }
    
    

All Problems

All Solutions