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
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
Approach 1 Basic Recursion -Problem TLE
class Solution {
public int climbStairs(int n) {
if(n==0) return 1;
if(n<0) return 0;
return climbStairs(n-1)+climbStairs(n-2);
}
}
It recalculates the same subproblems many times.
-
Time complexity: O(2ⁿ) → This will timeout for large
n
(liken = 45
or more).
Approach 2- Add Memoization (Top-Down + Cache)
class Solution {
public int climbStairs(int n) {
int[] dp = new int[n + 1];
Arrays.fill(dp, -1);
return helper(n, dp);
}
private int helper(int n, int[] dp) {
if (n == 0) return 1;
if (n < 0) return 0;
if (dp[n] != -1) return dp[n];
dp[n] = helper(n - 1, dp) + helper(n - 2, dp);
return dp[n];
}
}
Line | What it does |
---|---|
dp = new int[n + 1]; |
Create DP array to store subproblem results |
fill(dp, -1) |
Mark all as "not yet solved" |
helper(n, dp) |
Recursive function to solve the problem |
if (dp[n] != -1) |
Return already computed value (memoization) |
dp[n] = ... |
Store new result in DP for future reuse |
Comments
Post a Comment