Stock Span Problem Using Stack in DSA Typescript - Time & Space Complexity
We want to understand how the time needed to solve the stock span problem changes as the number of stock prices grows.
Specifically, how fast can we find the span for each price using a stack?
Analyze the time complexity of the following code snippet.
function calculateSpan(prices: number[]): number[] {
const stack: number[] = [];
const span: number[] = new Array(prices.length);
for (let i = 0; i < prices.length; i++) {
while (stack.length > 0 && prices[stack[stack.length - 1]] <= prices[i]) {
stack.pop();
}
span[i] = stack.length === 0 ? i + 1 : i - stack[stack.length - 1];
stack.push(i);
}
return span;
}
This code calculates the stock span for each day using a stack to track indices of previous higher prices.
Identify the loops, recursion, array traversals that repeat.
- Primary operation: The for-loop runs once for each price.
- How many times: The while-loop inside may pop elements, but each element is pushed and popped at most once.
As the number of prices grows, each price is processed once, and stack operations happen at most once per price.
| Input Size (n) | Approx. Operations |
|---|---|
| 10 | About 20 (each price pushed and popped once) |
| 100 | About 200 |
| 1000 | About 2000 |
Pattern observation: The total operations grow roughly in a straight line with input size.
Time Complexity: O(n)
This means the time needed grows directly in proportion to the number of prices.
[X] Wrong: "The while-loop inside the for-loop makes this an O(n²) algorithm because it can run many times per price."
[OK] Correct: Each price index is pushed and popped only once, so the total number of while-loop iterations across all prices is at most n, not n times n.
Understanding this stack-based approach shows you how to use data structures smartly to reduce repeated work, a key skill in coding interviews.
"What if we used a simple nested loop without a stack? How would the time complexity change?"
Practice
Solution
Step 1: Understand the problem definition
The Stock Span Problem finds how many days in a row before today had prices less than or equal to today's price.Step 2: Identify what is calculated for each day
For each day, it counts consecutive previous days with prices not higher than current day.Final Answer:
The number of consecutive days before the current day with a price less than or equal to the current day's price -> Option CQuick Check:
Stock span = consecutive days with price ⤠current day price [OK]
- Thinking it finds max price overall
- Confusing span with price difference
- Calculating average price instead
Solution
Step 1: Recall the problem needs to track previous prices efficiently
We need to quickly find previous days with prices less or equal to current day.Step 2: Identify the data structure that supports last-in-first-out access
A stack allows pushing and popping previous prices to compare efficiently.Final Answer:
Stack -> Option AQuick Check:
Stack is used for last-in-first-out access [OK]
- Using queue which is FIFO, not suitable
- Using set which does not maintain order
- Using array without stack logic
[100, 80, 60, 70, 60, 75, 85]?Solution
Step 1: Calculate span for each day
Day 0: 100 -> span 1 (no previous)
Day 1: 80 ⤠100 -> span 1
Day 2: 60 ⤠80 -> span 1
Day 3: 70 > 60 -> span 2 (days 2 and 3)
Day 4: 60 ⤠70 -> span 1
Day 5: 75 > 60, 70 -> span 4 (days 2,3,4,5)
Day 6: 85 > 75, 70, 80 -> span 6 (days 1 to 6)Step 2: Confirm final span array
The spans are [1, 1, 1, 2, 1, 4, 6].Final Answer:
[1, 1, 1, 2, 1, 4, 6] -> Option DQuick Check:
Span array matches calculated values [OK]
- Counting all previous days regardless of price
- Confusing span with cumulative sum
- Miscounting days when price increases
function calculateSpan(prices: number[]): number[] {
const stack: number[] = [];
const span: number[] = [];
for (let i = 0; i < prices.length; i++) {
while (stack.length > 0 && prices[stack[stack.length - 1]] <= prices[i]) {
stack.pop();
}
span[i] = stack.length === 0 ? i + 1 : i - stack[stack.length - 1];
stack.push(i);
}
return span;
}Solution
Step 1: Analyze the while loop condition
The condition uses < to pop smaller prices, but equal prices should also be popped to count span correctly.Step 2: Correct the comparison operator
Change < to <= so that prices equal to current price are popped, ensuring correct span calculation.Final Answer:
The comparison operator should be <= instead of < in while condition -> Option BQuick Check:
Use <= to include equal prices in span [OK]
- Using < misses equal prices in span
- Storing prices instead of indices in stack
- Starting loop from 1 misses first day
[10, 4, 5, 90, 120, 80], how would you modify the standard Stock Span algorithm to also return the day index of the last higher price before each day? What is the output for the last higher price indices array?Solution
Step 1: Modify algorithm to track last higher price index
Along with span, store index from stack top before popping. If stack empty, store -1.Step 2: Calculate last higher price indices for each day
Day 0 (10): no previous higher -> -1
Day 1 (4): previous higher 10 at index 0 -> 0
Day 2 (5): previous higher 10 at index 0 -> 0
Day 3 (90): no previous higher -> -1
Day 4 (120): no previous higher -> -1
Day 5 (80): previous higher 120 at index 4 -> 4Final Answer:
[-1, 0, 0, -1, -1, 4] -> Option AQuick Check:
Last higher price indices match calculated values [OK]
- Returning span instead of last higher price indices
- Using price values instead of indices
- Assigning wrong indices when stack is empty
Ready to prove it?
Pass the test and this pattern moves unknown
