题目
给你一个整数数组 arr 和一个目标值 target ,请你返回一个整数 value ,使得将数组中所有大于 value 的值变成 value 后,数组的和最接近 target (最接近表示两者之差的绝对值最小)。
如果有多种使得和最接近 target 的方案,请你返回这些整数中的最小值。
请注意,答案不一定是 arr 中的数字。
class Solution:
def findBestValue(self, arr, target):
n = len(arr)
left = target // n
right = target
def sum_of_replce_larger_than_value(value):
ret = 0
for e_ in arr:
ret += min(e_, value)
return ret
min_value = float("inf")
sum_arr = 0
max_value = 0
for e in arr:
min_value = min(e, min_value)
max_value = max(e, max_value)
sum_arr += e
if sum_arr < target:
return max_value
if min_value > target:
return min_value
while left < right:
mid = left + (right - left) // 2
sum_value = sum_of_replce_larger_than_value(mid)
if sum_value == target:
right = mid
elif sum_value < target:
left = mid + 1
else:
right = mid - 1
return min([abs(sum_of_replce_larger_than_value(left - 1) - target), left - 1],
[abs(sum_of_replce_larger_than_value(left) - target), left],
[abs(sum_of_replce_larger_than_value(left + 1) - target), left + 1]
)[1]
总结: 用时尽一小时。主要是特殊情况没有考虑到。
主要是
1. 和小于target时
2. 最小值大于target时
当前代码实现有点儿丑。待优化。
二分查找最难处理的就是边界条件。需要针对各种情况输出相关自动化用例。