給你一個整數數組 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;}
}