老师有时间方便的话,看下我自己实现的floor函数是否可行或者改进的地方。

来源:5-1 二分查找法(Binary Search)

qq_邪饿的小强_0

2018-04-03

/**
* 查找arr[l,r]的floor索引
* @param arr
* @param target
* @param l
* @param r
* @return
*/
public static int floor(Comparable[] arr, Comparable target,int l,int r){

   if(l > r){
       //没有相等的就返回左边的索引值
       return r;
   }
   int i = l + (r - l)/2;
   if(arr[i].compareTo(target) == 0){

       //如果左边相等 索引左移动
       while (i-1 >= l && arr[i-1].compareTo(arr[i]) == 0) i--;

           return i;

   }else if(arr[i].compareTo(target)<0){

       l = i+1;
       //如果右边相等 索引右移动
       while (l+1 <= r && arr[l+1].compareTo(arr[l]) == 0) l++;
   }else{
       r = i-1;
       //如果左边相等 索引左移动
       while (r-1 >= l && arr[r-1].compareTo(arr[r]) == 0) r--;
   }

   return floor(arr,target,l,r);
}



写回答

1回答

liuyubobobo

2018-04-03

0
0

算法与数据结构(C++版) 面试/评级的算法复习技能包

课程专为:短时间内应对面试、升职测评等艰巨任务打造

11187 学习 · 1614 问题

查看课程