Climbing Stairs Problem in DSA Python - Time & Space Complexity
We want to understand how the time needed 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.
def climb_stairs(n):
if n <= 2:
return n
dp = [0] * (n + 1)
dp[1], dp[2] = 1, 2
for i in range(3, n + 1):
dp[i] = dp[i - 1] + dp[i - 2]
return dp[n]
This code calculates the number of ways to climb n stairs, taking 1 or 2 steps at a time, using a bottom-up approach.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The for-loop that fills the dp array from 3 to n.
- How many times: It runs (n - 2) times, once for each stair from 3 to n.
As the number of stairs increases, the loop runs more times, adding one operation per stair.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | 8 (loop runs from 3 to 10) |
| 100 | 98 |
| 1000 | 998 |
Pattern observation: The operations grow roughly in a straight line as n increases.
Time Complexity: O(n)
This means the time to find the number of ways 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 loop and stores results, so it avoids repeating work and runs quickly in linear time.
Understanding this problem’s time complexity shows you can spot when to use dynamic programming to improve efficiency, a key skill in many coding challenges.
"What if we changed the code to use simple 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 asked
We want the total number of distinct sequences of 1-step and 2-step moves that sum to n.Final Answer:
The number of distinct ways to reach the top -> Option DQuick Check:
Count ways to climb = number of sequences [OK]
- Confusing number of ways with minimum steps
- Thinking about maximum steps instead of ways
- Counting total steps instead of sequences
Solution
Step 1: Check parameter and return types
The input n is an integer representing steps, and output is an integer count of ways.Step 2: Match function signature
def climb_stairs(n: int) -> int: correctly uses int input and int output with type hints.Final Answer:
def climb_stairs(n: int) -> int: -> Option AQuick Check:
Input int, output int function signature [OK]
- Using string type for input
- Returning string instead of int
- Missing input parameter
def climb_stairs(n: int) -> int:
if n <= 2:
return n
a, b = 1, 2
for _ in range(3, n + 1):
a, b = b, a + b
return b
print(climb_stairs(5))Solution
Step 1: Trace initial values and base cases
For n=5, start with a=1, b=2. Loop runs for i=3 to 5.Step 2: Calculate loop iterations
Iteration 3: a=2, b=3; Iteration 4: a=3, b=5; Iteration 5: a=5, b=8.Final Answer:
8 -> Option BQuick Check:
Ways to climb 5 steps = 8 [OK]
- Returning n for all inputs
- Off-by-one errors in loop
- Mixing a and b values
def climb_stairs(n: int) -> int:
if n == 1:
return 1
a, b = 1, 2
for i in range(2, n):
a = b
b = a + b
return b
print(climb_stairs(4))Solution
Step 1: Analyze variable updates inside loop
Inside loop, a is set to b, then b = a + b uses updated a, causing wrong sum.Step 2: Correct update order
We must update both simultaneously like a, b = b, a + b to avoid using updated a prematurely.Final Answer:
Variables a and b are updated incorrectly -> Option AQuick Check:
Simultaneous update needed for correct Fibonacci logic [OK]
- Updating variables sequentially causing wrong values
- Wrong loop range causing missed steps
- Missing base cases
Solution
Step 1: Understand step options and recurrence
With steps 1, 2, or 3 allowed, ways to reach i = sum of ways to reach i-1, i-2, and i-3.Step 2: Set correct base cases
dp[0]=1 (one way to stand still), dp[1]=1, dp[2]=2 (1+1 or 2 steps).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 CQuick Check:
Sum previous three dp values for 3-step climb [OK]
- Multiplying dp values instead of adding
- Using only two previous dp values
- Incorrect base cases
Ready to prove it?
Pass the test and this pattern moves unknown
