class Solution {
public int findBestValue(int[] arr, int target) {
int[] pre = new int[arr.length];
Arrays.sort(arr);
for (int i = 0; i < arr.length; i++) {
if (i == 0) {
pre[i] = arr[i];
} else {
pre[i] = pre[i - 1] + arr[i];
}
}
int l = 0;
int r = arr[arr.length - 1];
while (l < r) {
int mid = (l + r - 1) >> 1;
int midmid = (r + mid + 1) >> 1;
int midValue = getValue(arr, pre, mid, target);
int midmidValue = getValue(arr, pre, midmid, target);
if (midValue == 0) {
return mid;
}
if (midmidValue == 0) {
return midmid;
}
if (midValue > midmidValue) {
l = mid + 1;
} else {
r = midmid - 1;
}
}
return l;
}
public int getValue(int[] arr, int[] pre, int p, int target) {
int sum = 0;
if (arr[0] > p) {
return Math.abs(arr.length * p - target);
} else if (arr[arr.length - 1] < p) {
return Math.abs(pre[pre.length - 1] - target);
} else {
int t = binarySearch(arr, p);
return Math.abs((pre[t] + (arr.length - 1 - t) * p) - target);
}
}
public int binarySearch(int[] arr, int p) {
int l = 0;
int r = arr.length - 1;
while (l < r) {
int mid = (l + r + 1) >> 1;
if (arr[mid] > p) {
r = mid - 1;
} else if (arr[mid] < p) {
l = mid;
} else {
return mid;
}
}
return l;
}
}
2020-06-14
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...