Discover how a simple stack can turn a slow, tiring task into a fast, smart solution for stock analysis!
Why Stock Span Problem Using Stack in DSA Rust?
Imagine you are tracking daily stock prices on paper. For each day, you want to know how many consecutive previous days had prices less than or equal to today's price.
Doing this manually means checking every previous day one by one, which takes a lot of time as days go by.
Manually checking each previous day's price for every new day is slow and tiring. As the number of days grows, it becomes harder to keep track without mistakes.
You might lose count or forget some days, making your results wrong.
The Stock Span Problem uses a stack to remember important days' prices efficiently.
Instead of checking all previous days, the stack helps jump over days that are not needed, making the process fast and easy.
for i in 0..n { span[i] = 1; for j in (0..i).rev() { if prices[j] <= prices[i] { span[i] += 1; } else { break; } } }
let mut stack = Vec::new(); for i in 0..n { while !stack.is_empty() && prices[*stack.last().unwrap()] <= prices[i] { stack.pop(); } span[i] = if stack.is_empty() { i + 1 } else { i - *stack.last().unwrap() }; stack.push(i); }
This method lets you quickly find how many days in a row the stock price was lower or equal, helping you analyze trends instantly.
Traders use this to understand how strong a stock's price is compared to recent days, helping them decide when to buy or sell.
Manual checking is slow and error-prone for large data.
Stack helps skip unnecessary checks, speeding up the process.
Stock span shows how many days prices stayed below or equal to today's price.
Practice
Solution
Step 1: Understand the problem definition
The Stock Span Problem finds, for each day, the length of consecutive days ending on that day where prices are less than or equal to the current day's price.Step 2: Clarify what is calculated per day
It counts days backward until a higher price is found, including the current day.Final Answer:
The number of consecutive days ending with the current day with a price less than or equal to the current day's price -> Option AQuick Check:
Span counts consecutive lower/equal prices [OK]
- Confusing span with max or min price
- Counting all previous days instead of consecutive ones
- Calculating price differences instead of counts
Solution
Step 1: Identify the need for last-in-first-out access
The Stock Span Problem requires checking previous days' prices in reverse order, which fits stack behavior.Step 2: Choose Rust's stack implementation
Rust's Vec can be used as a stack with push and pop operations efficiently.Final Answer:
Vector (Vec) used as a stack -> Option BQuick Check:
Vec as stack fits LIFO for span calculation [OK]
- Using HashMap which is unordered
- Using LinkedList which is less efficient
- Using BinaryHeap which is for priority, not order
[100, 80, 60, 70, 60, 75, 85] using the Stock Span algorithm?Solution
Step 1: Calculate span for each price
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 (includes day 2)
Day 4: 60 < 70 -> span 1
Day 5: 75 > 60, 70 -> span 4 (includes days 4,3,2)
Day 6: 85 > 75, 70, 60, 80 -> span 6 (includes days 5,4,3,2,1)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 AQuick Check:
Span array matches calculated values [OK]
- Counting all previous days instead of consecutive
- Mixing up indices when calculating spans
- Assuming spans always increase
let mut stack: Vec<usize> = Vec::new();
let mut span = vec![0; prices.len()];
for i in 0..prices.len() {
while !stack.is_empty() && prices[*stack.last().unwrap()] < prices[i] {
stack.pop();
}
span[i] = if stack.is_empty() { i + 1 } else { i - stack.last().unwrap() };
stack.push(i);
}Solution
Step 1: Analyze span calculation line
span[i] = if stack.is_empty() { i + 1 } else { i - stack.last().unwrap() } uses stack.last().unwrap() without dereferencing, so it subtracts usize - &usize causing a type error or wrong calculation.Step 2: Correct dereferencing needed
It should be i - *stack.last().unwrap() to get the usize value from reference.Final Answer:
The span calculation subtracts without dereferencing the last stack element -> Option CQuick Check:
Dereference stack.last() for correct subtraction [OK]
- Using < instead of <= (not critical here)
- Not dereferencing stack.last() causing errors
- Initializing span with zeros is correct here
- Stack must store indices, not prices
Solution
Step 1: Understand streaming requirement
For streaming prices, we must update span without reprocessing all previous data.Step 2: Use stack with (price, span) pairs
Store each price with its span. When a new price arrives, pop all smaller prices and add their spans to current span, then push new pair.Step 3: Efficient update
This approach allows O(1) amortized time per new price, updating span incrementally.Final Answer:
Use a stack to store pairs of (price, span) and update span by accumulating popped spans -> Option DQuick Check:
Stack with (price, span) pairs for streaming [OK]
- Recalculating spans from scratch each time (inefficient)
- Using queue which doesn't support needed access pattern
- Using hash map which doesn't track order
Ready to prove it?
Pass the test and this pattern moves unknown
