Minimum Total Price After Applying Discounts
MediumRuntime
46 ms
Beats 34.48%
Memory
146.1 MB
Beats 9.76%
Problem
You are given two integer arrays prices and discounts.
The value prices[i] represents the price of the ith item, and discounts[j] represents a discount percentage.
You may apply discounts subject to the following rules:
- Each discount can be applied to at most one item.
- Each item can receive at most one discount.
- An item may also receive no discount.
If a discount of d percent is applied to an item with price p, its final price becomes (p * (100 - d)) / 100. The final price is not rounded.
Return the minimum possible sum of final prices after assigning discounts optimally. Answers within 10-5 of the actual answer will be accepted.
Example 1:
Input: prices = [10,30,21], discounts = [50,60]
Output: 32.50000
Explanation:
- Apply
discounts[1] = 60toprices[1] = 30, thus30 * (100 - 60) / 100 = 12. - Apply
discounts[0] = 50toprices[2] = 21, thus21 * (100 - 50) / 100 = 10.5. prices[0] = 10receives no discount, so it stays 10.
The total is 12 + 10.5 + 10 = 32.50000, which is the minimum possible.
Example 2:
Input: prices = [100,70], discounts = [10,40,50]
Output: 92.00000
Explanation:
- Apply
discounts[2] = 50toprices[0] = 100, thus100 * (100 - 50) / 100 = 50. - Apply
discounts[1] = 40toprices[1] = 70, thus70 * (100 - 40) / 100 = 42.
The total is 50 + 42 = 92.00000, which is the minimum possible.
Example 3:
Input: prices = [7,3,9], discounts = [100,100]
Output: 3.00000
Explanation:
- Apply
discounts[0] = 100toprices[2] = 9, thus9 * (100 - 100) / 100 = 0. - Apply
discounts[1] = 100toprices[0] = 7, thus7 * (100 - 100) / 100 = 0. prices[1] = 3receives no discount, so it stays 3.
The total is 0 + 0 + 3 = 3.00000, which is the minimum possible.
Constraints:
1 <= prices.length, discounts.length <= 1051 <= prices[i] <= 1051 <= discounts[j] <= 100
Solution
Javaimport java.util.Arrays;
class Solution {
public double minPrice(int[] prices, int[] discounts) { Arrays.sort(prices); // ascending
Arrays.sort(discounts); // ascending
int n = prices.length;
int k = discounts.length;
double total = 0;
int di = k - 1;
for (int i = n - 1; i >= 0; i--) {
if (di >= 0) {
total += prices[i] * (100.0 - discounts[di]) / 100.0;
di--; } else {
total += prices[i];
}
}
return total;
}
}