On a staircase, the i
-th step has some non-negative cost cost[i]
assigned (0 indexed).
Once you pay the cost, you can either climb one or two steps. You need to find minimum cost to reach the top floor, given that you can either start from the step with index 0 or the step with index 1.
___________ ___ | Final Step ___ | 20 ___ | 15 __________ | 10 First Step
Example 1:
Input: cost = [10, 15, 20] Output: 15 Explanation: Cheapest is start on cost[1], pay that cost and go to the top.
Example 2:
Input: cost = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1] Output: 6 Explanation: Cheapest is start on cost[0], and only step on 1s, skipping cost[3].
Note:
cost
will have a length in the range [2, 1000]
.cost[i]
will be an integer in the range [0, 999]
.The core challenge of this problem is to find the minimum cost to reach the top of the staircase. The significance of this problem lies in its application to dynamic programming, where we need to make optimal decisions at each step to minimize the total cost. A common pitfall is to assume that we must start from the first step, but we can start from either the first or the second step.
To solve this problem, we can use dynamic programming. The idea is to keep track of the minimum cost to reach each step and use this information to calculate the minimum cost to reach the next steps.
A naive solution would involve recursively calculating the cost to reach the top from each step, but this approach would be highly inefficient due to repeated calculations.
We can optimize the solution by using a dynamic programming approach. We will maintain an array dp
where dp[i]
represents the minimum cost to reach step i
. The recurrence relation will be:
dp[i] = cost[i] + min(dp[i-1], dp[i-2])
We can further optimize the space complexity by using two variables instead of an array to keep track of the minimum costs for the last two steps.
1. Initialize two variables to store the minimum cost to reach the last two steps.
2. Iterate through the cost array, updating the minimum cost for each step using the recurrence relation.
3. Return the minimum cost to reach the top, which will be the minimum of the last two steps.
def minCostClimbingStairs(cost):
# Initialize the first two steps
first = cost[0]
second = cost[1]
# Iterate through the cost array starting from the third step
for i in range(2, len(cost)):
current = cost[i] + min(first, second)
first = second
second = current
# The minimum cost to reach the top is the minimum of the last two steps
return min(first, second)
# Example usage
cost1 = [10, 15, 20]
print(minCostClimbingStairs(cost1)) # Output: 15
cost2 = [1, 100, 1, 1, 1, 100, 1, 1, 100, 1]
print(minCostClimbingStairs(cost2)) # Output: 6
The time complexity of this approach is O(n)
where n
is the length of the cost array, as we iterate through the array once. The space complexity is O(1)
since we only use two variables to store the minimum costs for the last two steps.
Potential edge cases include:
Each of these cases should be tested to ensure the algorithm handles them correctly.
To test the solution comprehensively, we should include a variety of test cases:
Using a testing framework like unittest
in Python can help automate and organize these tests.
When approaching such problems, it's important to:
Practicing similar problems and studying dynamic programming techniques can help improve problem-solving skills.
In this blog post, we discussed the problem of finding the minimum cost to climb stairs. We explored a dynamic programming approach to solve the problem efficiently and analyzed its complexity. Understanding and solving such problems is crucial for developing strong algorithmic skills.
For further reading and practice, consider the following resources: