思路如下:
先把数组从小到大排序,然后依次遍历数组,当前index为i,前0到i-1个数字的和为s,则剩余的值为target-s,假如当前arr[i]*(len(arr)-i)已经大于target-s了,则说明可以从当前第i个值开始,将所有之后的值均设置为同一个值,来逼近target,如果小于target-s,则说明即使从当前第i个值开始,将所有之后的值都设置为同一个值,也依旧会小于target,不是最优解。当大于target-s,则需要有一个边界判断,mean=target-s/(len(arr)-i),最优的value值是向上还是向下,可以通过判断当前mean和前后两个int值的差距,来决定选择哪个int值。
之所以找到一个一个最优解后就不用再向下找的原因是,假设在第i个找到了最优解,那么第i+1个,value只能在arr[i]-arr[i+1]中间取,无论如何当前的值是已经大于arr[i]*(len(arr)-i)的,哪怕向下取整也依旧是大于,不可能存在比第i个值找到的最优解还要逼近target。
class Solution:
def findBestValue(self, arr: List[int], target: int) -> int:
arr.sort()
s = 0
for i in range(len(arr)):
dis = target - s
num = len(arr)-i
if num*arr[i] >= dis:
float_mean = dis/(len(arr)-i)
int_mean = int(float_mean)
if (float_mean-int_mean) > 0.5:
return int_mean + 1
else:
return int_mean
s += arr[i]
return arr[-1]
```