LeetCode 1058. Minimize Rounding Error to Meet Target
原题链接在这里:https://leetcode.com/problems/minimize-rounding-error-to-meet-target/description/
题目:
Given an array of prices
[p1,p2...,pn]
and a target
, round each price pi
to Roundi(pi)
so that the rounded array [Round1(p1),Round2(p2)...,Roundn(pn)]
sums to the given target
. Each operation Roundi(pi)
could be either Floor(pi)
or Ceil(pi)
.
Return the string "-1"
if the rounded array is impossible to sum to target
. Otherwise, return the smallest rounding error, which is defined as Σ |Roundi(pi) - (pi)|
for i
from 1
to n
, as a string with three places after the decimal.
Example 1:
Input: prices = ["0.700","2.800","4.900"], target = 8 Output: "1.000" Explanation: Use Floor, Ceil and Ceil operations to get (0.7 - 0) + (3 - 2.8) + (5 - 4.9) = 0.7 + 0.2 + 0.1 = 1.0 .
Example 2:
Input: prices = ["1.500","2.500","3.500"], target = 10 Output: "-1" Explanation: It is impossible to meet the target.
Example 3:
Input: prices = ["1.500","2.500","3.500"], target = 9 Output: "1.500"
Constraints:
1 <= prices.length <= 500
- Each string
prices[i]
represents a real number in the range[0.0, 1000.0]
and has exactly 3 decimal places. 0 <= target <= 106
题解:
For each price, we either take the floor or the ceil.
If target is out of [all floor, all ceil], then there is no way to sum up to target, return -1.
We use sum to mark all floor, if there is diff between price - floor(price), we add to maxHeap. It means later, we could use ceil.
If sum > target, that means target is smaller than all floor values, return -1.
If sum < target - maxHeap.size(), that means even we choose all the ceil + sum, still smaller than target, return -1.
Otherwise, we can sum to target.
target -= sum is the diff we want to conquer.
If this diff > 0, then it means we would like to take a ceil. That is why we want maxHeap to maintain the diff, that means mininum diff to the ceil.
Otherwise, we want the other way.
Time Complexity: O(nlogn). n = prices.length.
Space: O(n).
AC Java:
1 class Solution { 2 public String minimizeError(String[] prices, int target) { 3 PriorityQueue<Double> maxHeap = new PriorityQueue<>(Collections.reverseOrder()); 4 int sum = 0; 5 for(String price : prices){ 6 double p = Double.valueOf(price); 7 sum += (int)p; 8 double diff = p - (int)p; 9 if(diff != 0){ 10 maxHeap.add(diff); 11 } 12 } 13 14 if(sum > target || sum + maxHeap.size() < target){ 15 return "-1"; 16 } 17 18 target -= sum; 19 double res = 0; 20 while(!maxHeap.isEmpty()){ 21 double top = maxHeap.poll(); 22 res += target > 0 ? (1 - top) : top; 23 target--; 24 } 25 26 return String.format("%.3f", res); 27 } 28 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
2022-08-03 LeetCode 465. Optimal Account Balancing
2022-08-03 LeetCode 1842. Next Palindrome Using Same Digits