LeetCode1300。配列が変換された後のターゲット値に最も近い配列の合計

トピック

整数配列arrとターゲット値ターゲットを指定します。値より大きいアレイ内のすべての値が値になった後、アレイの合計がターゲットに最も近くなるように(2つの差の絶対値に最も近くなるように)整数値を返してください最小)。
合計をターゲットに最も近くするスキームが複数ある場合は、これらの整数の中で最小の値を返してください。
答えは必ずしもarrの数ではないことに注意してください。リンク

アイデア

最初は平均を使用したいのですが、配列内のすべての要素を変更する必要はありませんvalue
範囲の値[0,max(arr)]が設定されthresholdていることを確認すると、要素よりも配列要素が配列に最も近い値にthresholdなりthreshold、配列と比較、最初の要素のtarget半分よりも厳密に大きくなる可能性があると判断されます。結果を決定することができます。targetthresholdthresholdthreshold-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;
    }
}

おすすめ

転載: blog.csdn.net/qq_42007742/article/details/106743691
おすすめ