二分查找题目-转变数组后最接近目标值的数组和

本文探讨了如何在一个整数数组中找到一个整数value,通过将数组中所有大于此值的元素替换为该值,使数组的总和最接近给定的目标值target。在遇到和小于目标或最小值大于目标的特殊情况时,提出了有效的解决方案,并通过二分查找法进行了优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

给你一个整数数组 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时

当前代码实现有点儿丑。待优化。
二分查找最难处理的就是边界条件。需要针对各种情况输出相关自动化用例。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值