力扣1300

23 篇文章 0 订阅
16 篇文章 0 订阅
"""
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]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值