给你一个整数数组 arr 和一个目标值 target ,请你返回一个整数 value ,使得将数组中所有大于 value 的值变成 value 后,数组的和最接近 target (最接近表示两者之差的绝对值最小)。
如果有多种使得和最接近 target 的方案,请你返回这些整数中的最小值。
请注意,答案不一定是 arr 中的数字。
示例 1:
输入:arr = [4,9,3], target = 10
输出:3
解释:当选择 value 为 3 时,数组会变成 [3, 3, 3],和为 9 ,这是最接近 target 的方案。
代码
class Solution {public int findBestValue(int[] arr, int target) {int n=arr.length,l=0,r=0;for(int c:arr){r= Math.max(r,c);}while (l<=r)//二分查找{int mid=(r-l)/2+l;int sum=0;for(int c:arr)//计算数组和{if(c>mid)sum+=mid;else sum+=c;}if(sum==target)return mid;else if(sum>target)r=mid-1;else l=mid+1;}int lSum=0,rSum=0;//比较左右区间,找出更接近目标值的点for(int c:arr){if(c>l)lSum+=l;else lSum+=c;if(c>r)rSum+=r;else rSum+=c;}return Math.abs(target-rSum)> Math.abs(target-lSum)?l:r;}
}