トピック
整数配列arrとターゲット値ターゲットを指定します。値より大きいアレイ内のすべての値が値になった後、アレイの合計がターゲットに最も近くなるように(2つの差の絶対値に最も近くなるように)整数値を返してください最小)。
合計をターゲットに最も近くするスキームが複数ある場合は、これらの整数の中で最小の値を返してください。
答えは必ずしもarrの数ではないことに注意してください。リンク
アイデア
最初は平均を使用したいのですが、配列内のすべての要素を変更する必要はありませんvalue
。。
範囲の値[0,max(arr)]
が設定されthreshold
ていることを確認すると、要素よりも配列要素が配列に最も近い値にthreshold
なりthreshold
、配列と比較して、最初の要素のtarget
半分よりも厳密に大きくなる可能性があると判断されます。結果を決定することができます。target
threshold
threshold
threshold-1
class Solution {
public int findBestValue(int[] arr, int target) {
int left=0,right=0;
for(int x:arr){
right=Math.max(right,x);
}
while(left<right){
int mid=left+(right-left)/2;
if(calSum(arr,mid)<target){
left=mid+1;
}else{
right=mid;
}
}
/*
这里left为第一个使数组和大于target的threshold
则left-1必然使得数组和小于target,即判断这两个哪个接近target
*/
if(target-calSum(arr,left-1)<=calSum(arr,left)-target){
return left-1;
}
return left;
}
int calSum(int[]arr,int threshold){
int sum=0;
for(int x:arr){
sum+=Math.min(threshold,x);
}
return sum;
}
}