给你一个整数数组 arr 和一个目标值 target ,请你返回一个整数 value ,使得将数组中所有大于 value 的值变成 value 后,数组的和最接近 target (最接近表示两者之差的绝对值最小)。
如果有多种使得和最接近 target 的方案,请你返回这些整数中的最小值。
双重二分搜索:
from typing import *
import bisect
class Solution:
"""
双重二分搜索
"""
def findBestValue(self, arr: List[int], target: int) -> int:
arr.sort()
sums = [0]
for val in arr:
sums.append(sums[-1] + val)
lo, hi = 0, arr[-1]
while lo <= hi:
mid = (hi - lo) // 2 + lo
tem_sum = self.find_sum(arr, sums, mid)
if tem_sum >= target:
hi = mid - 1
else:
lo = mid + 1
if abs(self.find_sum(arr, sums, hi) - target) <= abs(self.find_sum(arr, sums, hi + 1) - target):
return hi
return hi + 1
def find_sum(self, arr, sums, val):
idx = bisect.bisect_left(arr, val)
tem_sum = sums[idx] + val * (len(arr) - idx)
return tem_sum