次のように内容は次のとおりです。
整数配列を指定
arr
し、目標値target
、整数を返すvalue
、我々はより大きいすべての整数に変更するとき、そのようなことvalue
に等しくなるように指定された配列ではvalue
、アレイの合計が(絶対差で)できるだけ近くなるがtarget
。同点の場合には、最小のそのような整数を返します。
答えはneccesarillyから数ではないことに注意してください
arr
。例1:
入力:ARR = [4,9,3]、目標= 10 出力:3 9を合計し、その最適な答えだと3つのARRの変換を用いて、[3、3、3]:説明。例2:
入力:ARR = [2,3,5]、目標= 10 出力:5例3:
入力:ARR = [60864,25176,27249,21296,20204]、ターゲット= 56803 出力:11361制約:
1 <= arr.length <= 10^4
1 <= arr[i], target <= 10^5
問題解決のアイデア:まず編曲ソート。配列はすべて置き換え値の値の数よりも大きいはずである場合は、二分探索法による編曲に登場する値の位置を見つけることができ、要素の左半分は、要素の右半分の直接の合計を変更する必要はありません長さ*値について。
コードは以下の通りであります:
クラスのソリューション(オブジェクト): デフfindBestValue(自己、編曲、ターゲット): "" " :タイプ編曲:リスト[INT] :型ターゲット:INT :RTYPE:int型 """ インポート二分 差分 =フロート(' INF ' ) RES = 0 arr.sort() ヴァル = [] のカウント = 0 のための I でARR: カウント + = I val.append(カウント) するための V で範囲(0、ARR [-1] + 1 ): INX = bisect.bisect_right(ARR、v)の 量 = V *(LEN(ARR) - INX) であれば INX> 0:量+ =ヴァル[INX-1 ] であればデフ> ABS(量- ターゲット): 差分 = ABS(量- ターゲット) RES = Vの リターン RES