Climbing Stairs Problem in DSA Java - Time & Space Complexity
We want to know how the time to solve the climbing stairs problem changes as the number of stairs grows.
Specifically, how many steps does the program take to find the total ways to climb?
Analyze the time complexity of the following code snippet.
public int climbStairs(int n) {
if (n <= 2) return n;
int first = 1, second = 2;
for (int i = 3; i <= n; i++) {
int third = first + second;
first = second;
second = third;
}
return second;
}
This code calculates how many distinct ways there are to climb n stairs, taking 1 or 2 steps at a time.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The for-loop that runs from 3 to n, adding two numbers each time.
- How many times: It runs (n - 2) times, once for each stair from 3 up to n.
As the number of stairs increases, the loop runs more times, adding up the ways step by step.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | 8 additions |
| 100 | 98 additions |
| 1000 | 998 additions |
Pattern observation: The number of operations grows roughly in a straight line with n.
Time Complexity: O(n)
This means the time to find the answer grows directly with the number of stairs.
[X] Wrong: "Because the problem looks like Fibonacci, it must take exponential time."
[OK] Correct: This code uses a simple loop and stores only two numbers, so it runs quickly in a straight line, not repeating work.
Understanding this time complexity shows you can spot when a problem looks complex but can be solved efficiently with simple loops.
"What if we changed the code to use recursion without storing results? How would the time complexity change?"
Practice
Given n steps, how many distinct ways can you climb to the top if you can take 1 or 2 steps at a time?Solution
Step 1: Understand the problem statement
The problem asks for the count of different ways to climb to the top using 1 or 2 steps at a time.Step 2: Identify what is being counted
We count all possible sequences of 1-step and 2-step moves that sum to n steps.Final Answer:
The total number of distinct ways to reach the top -> Option CQuick Check:
Counting ways = total distinct sequences [OK]
- Confusing number of ways with minimum steps
- Thinking about maximum steps allowed
- Counting skipped steps instead of ways
n steps?Solution
Step 1: Check method return type and parameters
The method should return an integer count and accept an integer input for steps.Step 2: Validate each option
public int climbStairs(int n) returns int and takes int n, which fits the problem. Others either have wrong return type or parameter type.Final Answer:
public int climbStairs(int n) -> Option AQuick Check:
Return int count, input int steps [OK]
- Using void return type instead of int
- Missing input parameter
- Using wrong parameter type like String
public class Solution {
public static int climbStairs(int n) {
if (n <= 2) return n;
int a = 1, b = 2, c = 0;
for (int i = 3; i <= n; i++) {
c = a + b;
a = b;
b = c;
}
return c;
}
public static void main(String[] args) {
System.out.println(climbStairs(4));
}
}Solution
Step 1: Trace the loop for n=4
Initial a=1, b=2. Loop runs for i=3 and i=4.
i=3: c=1+2=3, a=2, b=3
i=4: c=2+3=5, a=3, b=5Step 2: Return value after loop
Return c=5, which is the number of ways to climb 4 steps.Final Answer:
5 -> Option DQuick Check:
Ways(4) = 5 [OK]
- Returning b instead of c
- Off-by-one errors in loop
- Misunderstanding base cases
public int climbStairs(int n) {
if (n == 1) return 1;
int[] dp = new int[n];
dp[0] = 1;
dp[1] = 2;
for (int i = 2; i <= n; i++) {
dp[i] = dp[i-1] + dp[i-2];
}
return dp[n];
}Solution
Step 1: Check array size and indexing
Array dp size is n, but loop runs i from 2 to n inclusive, accessing dp[n], which is out of bounds.Step 2: Identify correct loop range and return
Loop should run i < n, and return dp[n-1] to avoid index error.Final Answer:
Array index out of bounds due to dp size and loop range -> Option BQuick Check:
Loop index exceeds array size [OK]
- Looping to i <= n instead of i < n
- Returning dp[n] instead of dp[n-1]
- Incorrect base case handling
Solution
Step 1: Understand the new step options
Since you can take 1, 2, or 3 steps, ways to reach step i depend on previous 3 steps.Step 2: Formulate dp relation and base cases
dp[i] = dp[i-1] + dp[i-2] + dp[i-3]. Base cases: dp[0]=1 (one way to stand still), dp[1]=1, dp[2]=2.Final Answer:
Use dp[i] = dp[i-1] + dp[i-2] + dp[i-3] with base dp[0]=1, dp[1]=1, dp[2]=2 -> Option AQuick Check:
Include all step sizes in dp sum [OK]
- Ignoring 3-step moves in dp formula
- Multiplying dp values instead of adding
- Using recursion without caching causing slow run
Ready to prove it?
Pass the test and this pattern moves unknown
