题目来源:力扣(LeetCode)https://leetcode-cn.com/problems/sum-of-mutated-array-closest-to-target
给你一个整数数组 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
提示:
思路:二分查找
本题当中,可能比较棘手的是题目中【value 为整数,数组和接近 target】和【答案不一定是 arr 中的数字】。也就是说,题目要我们求的是最接近。
那么现在的问题就可以转变为去考虑如何去评判接近?下面罗列最接近的可能情况:
这如何去考虑第二种和第三种的情况,本篇幅所从采取的方案是确定上下边界,取可能的 value 值进行比较。
具体的做法:
具体的代码实现如下。
class Solution:
def findBestValue(self, arr: List[int], target: int) -> int:
def cacl_change_sum(arr, value):
res = 0
# 大于 value 的值要进行转变
for num in arr:
res += min(num, value)
return res
left = 0
right = max(arr)
while left < right:
mid = (left+ right) // 2
# 计算转化后的数组之和
res = cacl_change_sum(arr, mid)
# 查找第一个 value 使得转变的数组和大于等于 target
if res < target:
left = mid + 1
else:
right = mid
# 当找到第一个 value 使得转变的数组和大于等于 target 时,答案可能落在 value 或 value - 1
# 现在,比较两者间的结果,接近程度越小,则是返回结果
res1 = cacl_change_sum(arr, left)
res2 = cacl_change_sum(arr, left - 1)
if res1 - target < target - res2:
return left
return left - 1
文章原创,如果觉得写得好,欢迎关注点赞。微信公众号《书所集录》同步更新,同样欢迎关注点赞。
LeetCode 1300. 转变数组后最接近目标值的数组和 | Python
原文:https://www.cnblogs.com/yiluolion/p/13135765.html