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] <= 1000When you get asked this question in a real-life environment, it will often be ambiguous (especially at FAANG). Make sure to ask these questions in that case:
The brute force method for this problem is very straightforward. We need to calculate the final price for each item by checking all the items that come after it to see if there's a discount available.
Here's how the algorithm would work step-by-step:
def final_prices_brute_force(prices):
number_of_prices = len(prices)
final_prices = prices[:]
for current_price_index in range(number_of_prices):
# Iterate through prices to find a discount.
for next_price_index in range(current_price_index + 1, number_of_prices):
# Check for a discount and apply it if found.
if prices[next_price_index] <= prices[current_price_index]:
final_prices[current_price_index] = prices[current_price_index] - prices[next_price_index]
break
return final_pricesThe key idea is to use a special data structure that allows us to efficiently find the next smaller price for each item. We go through the prices one by one, keeping track of potential discounts in a way that avoids unnecessary comparisons.
Here's how the algorithm would work step-by-step:
def final_prices_with_discount(prices):
number_of_prices = len(prices)
final_prices = prices[:]
stack = []
for i in range(number_of_prices):
# The stack holds potential discounts.
while stack and prices[stack[-1]] >= prices[i]:
final_prices[stack[-1]] -= prices[i]
stack.pop()
# Add the current price index to the stack.
stack.append(i)
return final_prices| Case | How to Handle |
|---|---|
| Empty input array | Return an empty array immediately as there are no prices to process. |
| Input array with only one element | Return the array as is, since no discount can be applied. |
| Input array with a large number of elements | Ensure the chosen algorithm has a time complexity of O(n) or O(n log n) to prevent timeouts, considering memory constraints. |
| Input array where all prices are the same | All prices will be discounted by the same amount, resulting in all discounted prices being the original price minus the discount or remain same if no discounted element is present. |
| Input array where prices are monotonically increasing | All prices will remain unchanged since no price will have a discount available. |
| Input array where prices are monotonically decreasing | Each price will be discounted by the next price in the sequence (except the last one which will remain unchanged). |
| Input array containing zero values | Zero values should be treated as valid prices and discounts applied accordingly. |
| Input array with extremely large integer values that could cause overflow | Use appropriate data types (e.g., long) to prevent integer overflow during calculations. |