题目地址:
https://www.lintcode.com/problem/minimal-distance-in-the-array/description
给定两个数组 A A A和 B B B,要求返回一个与 B B B同长的数组 C C C,使得 C [ i ] C[i] C[i]是 A A A中离 B [ i ] B[i] B[i]最近的数字。如果答案不唯一,则返回较小的那个。
思路是排序 + 二分。先对 A A A排序,然后对每个 B [ i ] B[i] B[i]找到距离其最近的数,可以先用二分找到比它小的最大的数,比如说是 A [ k ] A[k] A[k],再比较一下 A [ k + 1 ] A[k+1] A[k+1]是不是离得更近。代码如下:
import java.util.Arrays;
public class Solution {
/**
* @param a: array a
* @param b: the query array
* @return: Output an array of length `b.length` to represent the answer
*/
public int[] minimalDistance(int[] a, int[] b) {
// Write your code here
int[] res = new int[b.length];
Arrays.sort(a);
for (int i = 0; i < b.length; i++) {
res[i] = binarySearch(a, b[i]);
}
return res;
}
private int binarySearch(int[] a, int target) {
int l = 0, r = a.length - 1;
while (l < r) {
int m = l + (r - l + 1 >> 1);
if (a[m] <= target) {
l = m;
} else {
r = m - 1;
}
}
// 如果a[l + 1]离得更近则返回a[l + 1],否则返回a[l]
if (l + 1 < a.length && a[l + 1] - target < target - a[l]) {
return a[l + 1];
} else {
return a[l];
}
}
}
时间复杂度 O ( ( l A + l B ) log l A ) O((l_A+l_B)\log l_A) O((lA+lB)loglA),空间 O ( 1 ) O(1) O(1)。