保证数组有正负数。
解法:二分查找+最小的两个数
public class Solution {
public int[] closed0TwoNum(int[] a) {
// 找最接近0的非负数
int i = binarySearch(a, 0);
// 添加候选集
List<Integer> candidates = new ArrayList<>();
candidates.add(a[i]);
candidates.add(a[i-1]);
if (i + 1 < a.length) candidates.add(a[i+1]);
if (i - 2 >= 0) candidates.add(a[i-2]);
// 找绝对值最小的两个数
int closed0 = Integer.MAX_VALUE, secClosed0 = Integer.MAX_VALUE;
for (int e : candidates) {
int absE = Math.abs(e);
int absClosed0 = Math.abs(closed0);
int absSecClosed0 = Math.abs(secClosed0);
if (absE < absClosed0) {
secClosed0 = closed0;
closed0 = e;
} else if (absE < absSecClosed0) {
secClosed0 = e;
}
}
return new int[]{closed0, secClosed0};
}
// 二分查找大于等于target的最小值
private int binarySearch(int[] a, int target) {
int low = 0, high = a.length - 1;
while (low <= high) {
int mid = (low + high) >>> 1;
if (a[mid] > target) high = mid - 1;
else if (a[mid] < target) low = mid + 1;
else return mid;
}
return low;
}
}
网友评论