第一题
leetcode475:供暖器
public class 第一题14 {
public static int findRadius(int[] houses, int[] heaters) {
Arrays.sort(houses);
Arrays.sort(heaters);
int max = Integer.MIN_VALUE;
for (int i = 0,j = 0;i < houses.length;i++){
while (!best(houses,heaters,i,j)){
j++;
}
max = Math.max(max,Math.abs(houses[i] - heaters[j]));
}
return max;
}
private static boolean best(int[] houses, int[] heaters, int i, int j) {
return j == heaters.length - 1 || (Math.abs(heaters[j] - houses[i]) < Math.abs(heaters[j + 1] - houses[i]));
}
}
第二题
public class 第二题14 {
public static void main(String[] args) {
int[] arr = {1,3,4,8,15,23,26,30,45,53};
int res1 = kthAbs1(arr, 13);
System.out.println(res1);
int res2 = kthAbs2(arr, 13);
System.out.println(res2);
}
public static int kthAbs1(int[] arr,int k){
int n = arr.length;
if (n < 2 || k < 0 || (n * (n - 1) / 2) < k){
return -1;
}
int[] del = new int[n * (n - 1) / 2];
int index = 0;
for (int i = 0;i < n;i++){
for (int j = i + 1;j < n;j++){
del[index++] = Math.abs(arr[j] - arr[i]);
}
}
Arrays.sort(del);
return del[k - 1];
}
public static int kthAbs2(int[] arr,int k){
int n = arr.length;
if (n < 2 || k < 0 || (n * (n - 1) / 2) < k){
return -1;
}
Arrays.sort(arr);
int l = 0;
int r = arr[n - 1] - arr[0];
int rightlast = -1;
while (l <= r){
int mid = (l + r) / 2;
if (isVail(arr,mid,k)){
rightlast = mid;
l = mid + 1;
}else {
r = mid - 1;
}
}
return rightlast + 1;
}
private static boolean isVail(int[] arr, int mid, int k) {
int count = 0;
for (int l = 0,r = 1;l < arr.length;r = Math.max(r,l++)){
while (r < arr.length && arr[r] - arr[l] <= mid){
r++;
}
count += r - l - 1;
}
return count < k;
}
}