Given a target number and an integer array A sorted in ascending order, find the indexi
in A such that A[i] is closest to the given target.
Return -1 if there is no element in the array.
Notice
There can be duplicate elements in the array, and we can return any of the indices with same value.
Example
Given[1, 2, 3]
and target =2
, return1
.
Given[1, 4, 6]
and target =3
, return1
.
Given[1, 4, 6]
and target =5
, return1
or2
.
Given[1, 3, 3, 4]
and target =2
, return0
or1
or2
.
分析
典型二分法模板, 主要关注在出了循环后,对target, begin ,end三个值大小判断的三种情况
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 begin = 0;
int end = A.length -1;
while(begin + 1 < end){
int mid = begin + (end - begin)/2;
if(A[mid] == target){
return mid;
}else if(A[mid] > target){
end = mid;
}else{
begin = mid;
}
}
if(A[begin] >= target){
return begin;
}else if (A[end] <= target){
return end;
}
if(target - A[begin] < A[end] - target){
return begin;
}else{
return end;
}
}
}