"""
1300. 转变数组后最接近目标值的数组和
给你一个整数数组 arr 和一个目标值 target ,请你返回一个整数 value ,
使得将数组中所有大于 value 的值变成 value 后,数组的和最接近 target (最接近表示两者之差的绝对值最小)。
如果有多种使得和最接近 target 的方案,请你返回这些整数中的最小值。
请注意,答案不一定是 arr 中的数字。
示例 1:
输入:arr = [4,9,3], target = 10
输出:3
解释:当选择 value 为 3 时,数组会变成 [3, 3, 3],和为 9 ,这是最接近 target 的方案。
示例 2:
输入:arr = [2,3,5], target = 10
输出:5
示例 3:
输入:arr = [60864,25176,27249,21296,20204], target = 56803
输出:11361
"""
from typing import *
class Solution:
def findBestValue(self, arr: List[int], target: int) -> int:
"""
首先进行排序
这段代码是通过计算剩余值的平均值a
若a > 当前数组值,说明还得继续找,
若a < 当前数组值,那么继续找,会让其比target越来越大
因此这里我们做一个五舍六入,返回值
由于a是剩余值的平均值,因此前面的值是不影响的
:param arr:
:param target:
:return:
"""
arr.sort()
s, n = 0, len(arr)
for i in range(len(arr)):
avg = (target - s) / (n - i) # 剩余值的平均值
if avg < arr[i]:
# 由于数组排序过后是递增的,所以往后找也就没有意义
# 因此直接返回平均值五舍六入
return int(avg + 0.4999999)
s += arr[i]
return arr[-1]
力扣1300
最新推荐文章于 2023-12-15 08:24:27 发布