可查找重复元素的二分查找算法

Posted 奇迹码农

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了可查找重复元素的二分查找算法相关的知识,希望对你有一定的参考价值。

可查找重复元素的二分查找算法

思路:

1、先定义两个下标 , left = 0 , right = arr.length -1;

2、因为我们也不知道要循环多少次,定义一个while循环,终止条件为right>left

3、因为是二分查找,定义一个mid = left + (right - left)/2; //;防止数据过大溢出

4、定义三个if语句,如果 target == arr[mid], return mid;这是经典的二分查找,我们需要在这做改进

4.1、改进经典二分算法,二分查找是基于有序的数组,重复的元素都在一起。我们只需要在if(target == arr[mid])里面修改即可;我们需要返回第一个出现target的下标;因为我们也不知道mid前面有几个重复的元素因此我们需要一个while(mid>=0)的循环,mid--,然后比对arr[mid]和target,只要不一样就终止,返回

5、如果 target < arr[mid] , right = mid - 1;

6、如果target > arr[mid] , left = mid + 1;

知道了思路,我们来编程实现一下吧

/**     * 可查找重复元素的二分查找算法     * 思路:       *  1、先定义两个下标 , left = 0 , right = arr.length -1;     *  2、因为我们也不知道要循环多少次,定义一个while循环,终止条件为right>left     *  3、因为是二分查找,定义一个mid = left + (right - left) / 2;防止数据过大溢出     *  4、定义三个if语句,如果 target == arr[mid], return mid;这是经典的二分查找,我们需要在这做改进     *  4.1、改进经典二分算法,因为可能有重复元素,我们需要返回第一个出现target的下标;因为我们也不知道mid前面有几个重复的元素     * 因此我们需要一个while(mid>=0)的循环,mid--,然后比对arr[mid]和target,只要不一样就终止,返回     *  5、如果 target < arr[mid] , right = mid - 1;     *  6、如果target > arr[mid] , left = mid + 1;     * @param nums     * @param target     * @return     */
    public static int binarySearch(int[] nums , int target){        
        int left = 0;        
       int right = nums.length - 1;                while(left <= right ) {            
           int mid = (left + (right - left) / 2);
           if( target == nums[mid] ) {              
                while(mid >= 0) {                    
                    if(nums[mid] != target) {                      
                         break;                      }                    mid--;                  }                
                 if(mid <= -1 ) {                    
                     return 0;                  }                
                 return mid + 1;//多减了一次,返回的时候需要再加1            }else if( target < nums[mid] ) {                right = mid - 1;            }else {                left = mid + 1;            }        }                return -1;    }


以上是关于可查找重复元素的二分查找算法的主要内容,如果未能解决你的问题,请参考以下文章

python算法:二分查找

算法-二分查找2

查找算法——二分查找

[经典面试题]二分查找问题汇总

二分查找算法讲解及其C++代码实现

Java算法 -- 二分查找:查找目标元素最左的位置和最右的位置局部最小值问题求解