Off-by-one on range boundaries
Wrong move: Loop endpoints miss first/last candidate.
Usually fails on: Fails on minimal arrays and exact-boundary answers.
Fix: Re-derive loops from inclusive/exclusive ranges before coding.
Build confidence with an intuition-first walkthrough focused on array fundamentals.
You are given an integer array prices where prices[i] is the price of the ith item in a shop.
There is a special discount for items in the shop. If you buy the ith item, then you will receive a discount equivalent to prices[j] where j is the minimum index such that j > i and prices[j] <= prices[i]. Otherwise, you will not receive any discount at all.
Return an integer array answer where answer[i] is the final price you will pay for the ith item of the shop, considering the special discount.
Example 1:
Input: prices = [8,4,6,2,3] Output: [4,2,4,2,3] Explanation: For item 0 with price[0]=8 you will receive a discount equivalent to prices[1]=4, therefore, the final price you will pay is 8 - 4 = 4. For item 1 with price[1]=4 you will receive a discount equivalent to prices[3]=2, therefore, the final price you will pay is 4 - 2 = 2. For item 2 with price[2]=6 you will receive a discount equivalent to prices[3]=2, therefore, the final price you will pay is 6 - 2 = 4. For items 3 and 4 you will not receive any discount at all.
Example 2:
Input: prices = [1,2,3,4,5] Output: [1,2,3,4,5] Explanation: In this case, for all items, you will not receive any discount at all.
Example 3:
Input: prices = [10,1,1,6] Output: [9,0,1,6]
Constraints:
1 <= prices.length <= 5001 <= prices[i] <= 1000Problem summary: You are given an integer array prices where prices[i] is the price of the ith item in a shop. There is a special discount for items in the shop. If you buy the ith item, then you will receive a discount equivalent to prices[j] where j is the minimum index such that j > i and prices[j] <= prices[i]. Otherwise, you will not receive any discount at all. Return an integer array answer where answer[i] is the final price you will pay for the ith item of the shop, considering the special discount.
Start with the most direct exhaustive search. That gives a correctness anchor before optimizing.
Pattern signal: Array · Stack
[8,4,6,2,3]
[1,2,3,4,5]
[10,1,1,6]
Source-backed implementations are provided below for direct study and interview prep.
// Accepted solution for LeetCode #1475: Final Prices With a Special Discount in a Shop
class Solution {
public int[] finalPrices(int[] prices) {
int n = prices.length;
Deque<Integer> stk = new ArrayDeque<>();
for (int i = n - 1; i >= 0; --i) {
int x = prices[i];
while (!stk.isEmpty() && stk.peek() > x) {
stk.pop();
}
if (!stk.isEmpty()) {
prices[i] -= stk.peek();
}
stk.push(x);
}
return prices;
}
}
// Accepted solution for LeetCode #1475: Final Prices With a Special Discount in a Shop
func finalPrices(prices []int) []int {
stk := []int{}
for i := len(prices) - 1; i >= 0; i-- {
x := prices[i]
for len(stk) > 0 && stk[len(stk)-1] > x {
stk = stk[:len(stk)-1]
}
if len(stk) > 0 {
prices[i] -= stk[len(stk)-1]
}
stk = append(stk, x)
}
return prices
}
# Accepted solution for LeetCode #1475: Final Prices With a Special Discount in a Shop
class Solution:
def finalPrices(self, prices: List[int]) -> List[int]:
stk = []
for i in reversed(range(len(prices))):
x = prices[i]
while stk and x < stk[-1]:
stk.pop()
if stk:
prices[i] -= stk[-1]
stk.append(x)
return prices
// Accepted solution for LeetCode #1475: Final Prices With a Special Discount in a Shop
impl Solution {
pub fn final_prices(mut prices: Vec<i32>) -> Vec<i32> {
let mut stk: Vec<i32> = Vec::new();
for i in (0..prices.len()).rev() {
let x = prices[i];
while !stk.is_empty() && x < *stk.last().unwrap() {
stk.pop();
}
if let Some(&top) = stk.last() {
prices[i] -= top;
}
stk.push(x);
}
prices
}
}
// Accepted solution for LeetCode #1475: Final Prices With a Special Discount in a Shop
function finalPrices(prices: number[]): number[] {
const stk: number[] = [];
for (let i = prices.length - 1; ~i; --i) {
const x = prices[i];
while (stk.length && stk.at(-1)! > x) {
stk.pop();
}
prices[i] -= stk.at(-1) || 0;
stk.push(x);
}
return prices;
}
Use this to step through a reusable interview workflow for this problem.
For each element, scan left (or right) to find the next greater/smaller element. The inner scan can visit up to n elements per outer iteration, giving O(n²) total comparisons. No extra space needed beyond loop variables.
Each element is pushed onto the stack at most once and popped at most once, giving 2n total operations = O(n). The stack itself holds at most n elements in the worst case. The key insight: amortized O(1) per element despite the inner while-loop.
Review these before coding to avoid predictable interview regressions.
Wrong move: Loop endpoints miss first/last candidate.
Usually fails on: Fails on minimal arrays and exact-boundary answers.
Fix: Re-derive loops from inclusive/exclusive ranges before coding.
Wrong move: Pushing without popping stale elements invalidates next-greater/next-smaller logic.
Usually fails on: Indices point to blocked elements and outputs shift.
Fix: Pop while invariant is violated before pushing current element.