在一个排好序的数组 A 中找到 i 使得 A[i] 最接近 target
样例
样例1:
输入:[1, 2, 3] ,target = 2
输出: 1.
样例2:
输入:[1, 4, 6], target = 3
输出: 1.
样例3:
输入:[1, 4, 6],target = 5,
输出: 1 或 2.
挑战
O(logn)时间复杂度。
注意事项
数组中可以有重复的元素,可以返回任何具有相同值的下标。
解题思路:
与Lintcode 458. 目标最后位置相似,更改一些条件使l和r最后对应寻找元素的两边,再比较l和r得到最接近元素。
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 || target < A[0])
return 0;
if(target > A[A.length - 1])
return A.length - 1;
int l = 0, r = A.length - 1;
while(l < r - 1){
int mid = l + (r - l) / 2;
if(A[mid] == target)
return mid;
else if(A[mid] > target)
r = mid;
else
l = mid;
}
if(Math.abs(target - A[l]) < Math.abs(target - A[r]))
return l;
else
return r;
}
}