题目地址:
https://www.lintcode.com/problem/closest-number-in-sorted-array/description
给定一个升序数组,题目保证无重复数字,再给定一个target,问数组中离target最近的数的index。
可以用二分法。取中间的数,如果target小于这个数,说明这个数右边所有数都不可能是最优解;反之如果大于,说明这个数左边所有数都不可能是最优解;等于的话当然就直接返回了。代码如下:
public class Solution {
/**
* @param A: an integer array sorted in ascending order
* @param target: An integer
* @return: an integer
*/
public int closestNumber(int[] A, int target) {
// write your code here
if (A == null || A.length == 0) {
return -1;
}
int l = 0, r = A.length - 1;
while (l + 1 < r) {
int m = l + (r - l >> 1);
if (target < A[m]) {
r = m;
} else if (target > A[m]) {
l = m;
} else {
return m;
}
}
return Math.abs(A[l] - target) < Math.abs(A[r] - target) ? l : r;
}
}
时间复杂度 O ( log n ) O(\log n) O(logn)。
注意点:
由于这里更新
l
l
l和
r
r
r的时候,都不能保证区间一定缩小,所以while的条件需要写成
l
+
1
<
r
l + 1 < r
l+1<r,以确保不发生死循环,当区间只有两个数的时候就快速退出来,再判断哪个是最优解。