Start learning free

LESSON 348 OF 410 · DYNAMIC PROGRAMMING

Min Cost Climbing Stairs - Java Solution and Time Complexity Analysis

Practice O(n) Read the full explanation

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:

  1. cost will have a length in the range [2, 1000].
  2. Every cost[i] will be an integer in the range [0, 999].

STEP 1 OF 3
    Ctrl + Enter to check

    JAVA · DYNAMIC PROGRAMMING

    Min Cost Climbing Stairs in Java, explained

    Understanding the Problem

    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 starting from the first step is always the best option, which is not necessarily true.

    Approach

    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 top.

    Naive Solution

    A naive solution would involve recursively calculating the cost for each step, but this approach is not optimal due to its exponential time complexity.

    Optimized Solution

    We can optimize the solution by using a bottom-up 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.

    Algorithm

    1. Initialize two variables to store the minimum cost to reach the last two steps.

    2. Iterate through the cost array and update the variables based on the recurrence relation.

    3. Return the minimum of the two variables as the result.

    Code Implementation

    
    public class MinCostClimbingStairs {
        public int minCostClimbingStairs(int[] cost) {
            // Initialize the minimum costs for the first two steps
            int cost1 = 0;
            int cost2 = 0;
    
            // Iterate through the cost array
            for (int i = 0; i < cost.length; i++) {
                // Calculate the current cost
                int currentCost = cost[i] + Math.min(cost1, cost2);
                // Update the costs for the next iteration
                cost1 = cost2;
                cost2 = currentCost;
            }
    
            // Return the minimum cost to reach the top
            return Math.min(cost1, cost2);
        }
    
        public static void main(String[] args) {
            MinCostClimbingStairs solution = new MinCostClimbingStairs();
            int[] cost1 = {10, 15, 20};
            int[] cost2 = {1, 100, 1, 1, 1, 100, 1, 1, 100, 1};
    
            System.out.println(solution.minCostClimbingStairs(cost1)); // Output: 15
            System.out.println(solution.minCostClimbingStairs(cost2)); // Output: 6
        }
    }
    

    Complexity Analysis

    The time complexity of the optimized solution is O(n), where n is the length of the cost array. This is because we iterate through the array once. The space complexity is O(1) since we only use two additional variables.

    Edge Cases

    Potential edge cases include:

    • Minimum length of the cost array (2 elements).
    • All elements in the cost array being zero.
    • All elements in the cost array being the maximum value (999).

    Each algorithm handles these edge cases effectively by following the same logic.

    Testing

    To test the solution comprehensively, consider the following test cases:

    • Simple cases with small arrays.
    • Cases with alternating high and low costs.
    • Cases with all costs being the same.

    Using a testing framework like JUnit can help automate and validate these test cases.

    Thinking and Problem-Solving Tips

    When approaching such problems, it's essential to:

    • Break down the problem into smaller subproblems.
    • Think about the base cases and how to build up the solution.
    • Consider both time and space complexity when optimizing.

    Practicing similar problems and studying dynamic programming techniques can significantly improve problem-solving skills.

    Conclusion

    In this blog post, we discussed the Min Cost Climbing Stairs problem, explored various approaches to solve it, and provided a detailed Java implementation. Understanding and solving such problems is crucial for developing strong algorithmic thinking and problem-solving skills.

    Additional Resources

    For further reading and practice, consider the following resources:

    Keep going with JavaAbout 340 step-by-step lessons, from your first line of code to coding interviews. Free to start.
    Start learning free