输入:[1,2,3,3,4,5,6,7,8] 3
输出:2
输入:[1,3,5,7,9] 4
输出:1
实现方式:二分+递归
主要思想:设置两个游标,start,end,取start和end的中位数,及其左边一位,和右边一位,将三者与目标值的绝对差值进行比较。设中位数与目标的绝对差值为sm,左边一位的绝对差值为sl,右边一位的绝对差值为sr,对比较的结果我们花开两枝
1. sm < sl && sm< sr:中位数与目标之间的差距比最近的左右两边都小,可以直接确定这就是最接近的值了
若不满足条件1,则对此中位数的左右两边的子集分别求最接近的下标,并再次比较,取二者最接近的那一个
NO BB,SHOW CODE
public static int findNearest(int[] array, int start, int end, int num){
int midIndex=(start+end)/2;
if(start >= end){
return start;
}
int mid=array[midIndex];
int left=array[(midIndex-1)<start? start:(midIndex-1)];
int right=array[(midIndex+1)>end? end:(midIndex+1)];
int