[Swift-2019力扣杯春季初赛]3. 最小化舍入误差以满足目标
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(shanqingyongzhi)
➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/)
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:
➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
给定一系列价格 [p1,p2...,pn]
和一个目标 target
,将每个价格 pi
舍入为 Roundi(pi)
以使得舍入数组 [Round1(p1),Round2(p2)...,Roundn(pn)]
之和达到给定的目标值 target
。每次舍入操作 Roundi(pi)
可以是向下舍 Floor(pi)
也可以是向上入 Ceil(pi)
。
如果舍入数组之和无论如何都无法达到目标值 target
,就返回 -1
。否则,以保留到小数点后三位的字符串格式返回最小的舍入误差,其定义为 Σ |Roundi(pi) - (pi)|( i 从 1 到 n )。
示例 1:
输入:prices = ["0.700","2.800","4.900"], target = 8 输出:"1.000" 解释: 使用 Floor,Ceil 和 Ceil 操作得到 (0.7 - 0) + (3 - 2.8) + (5 - 4.9) = 0.7 + 0.2 + 0.1 = 1.0 。
示例 2:
输入:prices = ["1.500","2.500","3.500"], target = 10 输出:"-1" 解释: 达到目标是不可能的。
提示:
1 <= prices.length <= 500
- 表示价格的每个字符串
prices[i]
都代表一个介于 0 和 1000 之间的实数,并且正好有 3 个小数位。 target
介于 0 和 1000000 之间。
44 ms
1 class Solution { 2 func minimizeError(_ prices: [String], _ target: Int) -> String { 3 var prices:[Double] = prices.map{Double($0)!} 4 var numMin:Int = 0 5 var numMax:Int = 0 6 var arrFloor:[Double] = [Double]() 7 var arrCeil:[Double] = [Double]() 8 for price in prices 9 { 10 let numFloor:Double = floor(price) 11 let numCeil:Double = ceil(price) 12 arrFloor.append(price - numFloor) 13 arrCeil.append(numCeil - price) 14 numMin += Int(numFloor) 15 numMax += Int(numCeil) 16 } 17 guard target >= numMin && target <= numMax else 18 { 19 return "-1" 20 } 21 let ceilCount:Int = target - numMin 22 let floorCount:Int = prices.count - ceilCount 23 let arrFloorSort:[Double] = arrFloor.sorted(by:<) 24 var res:Double = 0.0 25 for i in 0..<floorCount 26 { 27 res += arrFloorSort[i] 28 let index:Int = arrFloor.index(of:arrFloorSort[i])! 29 arrCeil[index] = 1.0 30 } 31 arrCeil.sort() 32 res += [Double](arrCeil[0..<ceilCount]).reduce(0,+) 33 return String(format:"%.3f",res) 34 } 35 }