Bird
Raised Fist0
Interview Prepdp-linear-fibonaccieasyAmazonGoogle

Minimum Cost Climbing Stairs

Choose your preparation mode4 modes available
</>
IDE
def minCostClimbingStairs(cost: list[int]) -> int:public int minCostClimbingStairs(int[] cost)int minCostClimbingStairs(vector<int>& cost)function minCostClimbingStairs(cost)
def minCostClimbingStairs(cost):
    # Write your solution here
    pass
class Solution {
    public int minCostClimbingStairs(int[] cost) {
        // Write your solution here
        return 0;
    }
}
#include <vector>
using namespace std;

int minCostClimbingStairs(vector<int>& cost) {
    // Write your solution here
    return 0;
}
function minCostClimbingStairs(cost) {
    // Write your solution here
}
Coming soon
0/10
Common Bugs to Avoid
Wrong: cost[n]Returning dp[n] instead of min(dp[n-1], dp[n-2]) as final answer.✅ Return min(dp[n-1], dp[n-2]) after filling dp array.
Wrong: sum of all costsAlways climbing one step without considering two-step jumps.✅ Use dp[i] = cost[i] + min(dp[i-1], dp[i-2]) to consider two-step jumps.
Wrong: higher than minimal costGreedy approach picking locally cheapest step only.✅ Implement DP to consider cumulative minimal cost, not just local minimum.
Wrong: IndexError or crashNot handling small input arrays or base cases properly.✅ Add explicit base cases for n=1 and n=2 to avoid invalid indexing.
Wrong: TimeoutUsing exponential recursion without memoization or DP.✅ Use bottom-up DP or top-down DP with memoization for O(n) time.
✓
Test Cases
t1_01basic
Input{"cost":[10,15,20]}
Expected15

Start at step 1 (cost 15), then climb two steps to the top, total cost 15.

t1_02basic
Input{"cost":[1,100,1,1,1,100,1,1,100,1]}
Expected6

Optimal path skips expensive steps, total cost 6.

t2_01edge
Input{"cost":[0]}
Expected0

Only one step with zero cost; minimal cost is 0.

t2_02edge
Input{"cost":[1,1]}
Expected1

Choose cheaper start step 0 or 1; minimal cost is 1.

t2_03edge
Input{"cost":[10,0,0,10]}
Expected0

Optimal path skips expensive steps, total cost 0.

t2_04edge
Input{"cost":[999,999,999,999]}
Expected1998

Must pay some cost; minimal cost is 1998 by choosing steps 0 and 2 or 1 and 3.

t3_01corner
Input{"cost":[1,100,1,1,100,1,100,1,1,100,1]}
Expected7

Greedy approach fails; must consider future costs to minimize total.

t3_02corner
Input{"cost":[0,0,0,0,0,0,0,0,0,0]}
Expected0

All zero costs; minimal cost is zero regardless of path.

t3_03corner
Input{"cost":[1,2,3,4,5,6,7,8,9,10]}
Expected25

Tests off-by-one errors in indexing and final step calculation.

t4_01performance
Input{"cost":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750,751,752,753,754,755,756,757,758,759,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872,873,874,875,876,877,878,879,880,881,882,883,884,885,886,887,888,889,890,891,892,893,894,895,896,897,898,899,900,901,902,903,904,905,906,907,908,909,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,930,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99]}
⏱ Performance - must finish in 2000ms

Large input n=100000; O(n) DP solution must complete within 2 seconds.

Practice

(1/5)
1. You are given an array of stock prices where you can complete at most two transactions (buy-sell pairs). Which algorithmic approach guarantees finding the maximum profit efficiently?
easy
A. Dynamic programming with state machine tracking transactions and holding states
B. Greedy approach that picks local minima and maxima twice
C. Brute force checking all pairs of buy and sell days twice
D. Divide and conquer splitting the array into two halves and combining results

Solution

  1. Step 1: Understand problem constraints

    At most two transactions means we must track states for 0, 1, or 2 completed transactions and whether we hold stock or not.
  2. Step 2: Identify suitable algorithm

    Greedy and divide-and-conquer fail to consider overlapping subproblems and state transitions correctly. Brute force is correct but inefficient. DP with state machines efficiently tracks profits per transaction count and holding state.
  3. Final Answer:

    Option A -> Option A
  4. Quick Check:

    DP with states is standard for multi-transaction stock problems [OK]
Hint: Track transactions and holding states with DP [OK]
Common Mistakes:
  • Assuming greedy picks always yield global optimum
  • Using brute force without pruning
2. You are given a list of daily stock prices and want to maximize profit by buying and selling any number of times, but you cannot hold more than one stock at a time. Which algorithmic approach guarantees the optimal solution for this problem?
easy
A. Greedy approach summing all positive price differences between consecutive days
B. Dynamic Programming using a state machine to track holding and not holding states
C. Pure brute force recursion exploring all buy/sell combinations without memoization
D. Divide and conquer by splitting the price array and merging results

Solution

  1. Step 1: Understand problem constraints

    The problem allows unlimited transactions but only one stock can be held at a time.
  2. Step 2: Identify suitable algorithm

    For this problem, the greedy approach of summing all positive price differences between consecutive days guarantees the optimal profit. This works because any profitable transaction can be decomposed into these increments.
  3. Final Answer:

    Option A -> Option A
  4. Quick Check:

    Greedy summing positive differences is optimal for unlimited transactions without cooldown or fees [OK]
Hint: Sum all positive price differences between consecutive days to get max profit [OK]
Common Mistakes:
  • Assuming DP is required when greedy suffices
  • Using brute force without memoization
  • Trying divide and conquer without state tracking
3. Consider the following Python function that computes the maximum profit from unlimited stock transactions. What is the value of the variable not_holding after the second iteration of the loop (i=2) when called with prices = [3, 2, 6]?
def maxProfit(prices):
    n = len(prices)
    not_holding = 0
    holding = -prices[0]
    for i in range(1, n):
        prev_not_holding = not_holding
        not_holding = max(not_holding, holding + prices[i])
        holding = max(holding, prev_not_holding - prices[i])
    return not_holding
easy
A. 6
B. 3
C. 0
D. 4

Solution

  1. Step 1: Initialize variables

    not_holding = 0, holding = -3 (since prices[0] = 3)
  2. Step 2: Iterate and update for i=1 and i=2

    i=1: prev_not_holding=0; not_holding = max(0, -3+2) = 0; holding = max(-3, 0-2) = -2 i=2: prev_not_holding=0; not_holding = max(0, -2+6) = 4; holding = max(-2, 0-6) = -2
  3. Final Answer:

    Option D -> Option D
  4. Quick Check:

    At i=2, not_holding is 4 after updates [OK]
Hint: Track variables carefully at each iteration [OK]
Common Mistakes:
  • Off-by-one errors in loop index
  • Confusing holding and not_holding updates
  • Forgetting to use prev_not_holding for holding update
4. What is the time complexity of the space-optimized DP solution for the Best Time -- 2 Transactions problem with input size n and fixed k=2?
medium
A. O(n^2)
B. O(n * k)
C. O(n)
D. O(k^n)

Solution

  1. Step 1: Identify loops in the code

    Outer loop runs n-1 times, inner loop runs k times (k=2 fixed). So total iterations ~ n*k.
  2. Step 2: Simplify complexity with fixed k

    Since k=2 is constant, O(n*k) simplifies to O(n).
  3. Final Answer:

    Option C -> Option C
  4. Quick Check:

    Linear time due to fixed number of transactions [OK]
Hint: Fixed k means linear time, not quadratic [OK]
Common Mistakes:
  • Confusing k as variable leading to O(n*k)
  • Assuming nested loops always mean O(n^2)
5. Examine the following code snippet for climbing stairs:
def climb_stairs(n):
    if n < 1:
        return 1
    first, second = 1, 1
    for i in range(2, n + 1):
        current = first + second
        first, second = second, current
    return second
Which line contains a subtle bug that can cause incorrect results or runtime errors?
medium
A. Line 2: Incorrect base case condition should be 'if n <= 1'
B. Line 4: Loop range should start from 1 instead of 2
C. Line 5: The addition 'first + second' should be 'first - second'
D. Line 6: The tuple assignment order is reversed

Solution

  1. Step 1: Analyze base case condition

    The condition 'if n < 1' returns 1 only when n is 0 or negative, but for n=1 it skips and runs the loop, which is incorrect.
  2. Step 2: Correct base case to 'if n <= 1'

    This ensures for n=0 or n=1, the function returns 1 immediately, matching problem definition.
  3. Final Answer:

    Option A -> Option A
  4. Quick Check:

    Base case off-by-one causes wrong results for n=1 [OK]
Hint: Check base cases carefully for off-by-one errors [OK]
Common Mistakes:
  • Using '<' instead of '<=' in base cases
  • Incorrect loop start index
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard