70. Climbing Stairs
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
Example: 2
Input: n = 3
Output: 3
            Constraints:
            
        - 1 <= n <= 45
 
             Explanation of Approach: 
            
        - The first thing that you should see is that we can move 1 or 2 steps at a time.
 - So, if there are N stairs, we can reach the Nth stair from (N-1)th stair and (N-2)th stair.
 - So, if we calculate no of ways to get to (N-1)th stair and (N-2)th stair, we can get the number of ways to reach the Nth stair (i.e noOfWays(N - 1) + noOfWays(N - 2) = noOfWays(N)).
 - Also handle the base case, which is N = 0, the 0th stair can only be reached in one way since it is the starting point.
 - Now you can code this recursively.
 
             Using DP to make the code more efficient: 
            
        - Now if we use recursion, we will be computing many states again and again.
 - This will lead to TLE.
 - This can be shown by the following example.
 - To compute noOfWays(5), we need to compute noOfWays(4) and noOfWays(3).
 - To compute noOfWays(4), we need to compute noOfWays(3) and noOfWays(2).
 - To compute noOfWays(3), we need to compute noOfWays(2) and noOfWays(1).
 - Here we can notice that, noOfWays(3) and noOfWays(2) are being computed twice.
 - If we had somehow bigger data, this would have resulted into TLE.
 - So we will store the results of the subproblems.
 - We will take the computed value of noOfWays(3) and store it in dp[3], and likewise for all 1 to N.
 - All above things are explained through code below.
 - Always remember, the result to a subproblem is obtained after the recursion from that state returns.
 
            Full Code using Recursion (Java):
            
                class Solution {
                    public int climbStairs(int n) {
                        return recur(n);
                    }
                    
                    int recur(int n) {
                        if(n < 0) return 0;
                        if(n == 0) return 1;
                        return recur(n - 1) + recur(n - 2);
                    }
                }
             
        
        
            Full Code using DP (Java):
            
                class Solution {
                    public int climbStairs(int n) {
                        // making array dp to store subproblems
                        int[] dp = new int[n + 1];
                        return recur(n, dp);
                    }
                    
                    int recur(int n, int[] dp) {
                        // handling base cases
                        if(n < 0) return 0;
                        if(n == 0) return 1;
                        // reusing the value stored for this subproblem.
                        if(dp[n] != 0) return dp[n];
                        // computing and storing the result of subproblem.
                        // the dp[n] value is completely computed 
                        // after recur(n - 1, dp) and recur(n - 2, dp) return
                        dp[n] = recur(n - 1, dp) + recur(n - 2, dp);
                        return dp[n];
                    }
                }
             
        
    
Comments
Post a Comment
If you have any queries or need solution for any problem, please let me know.