zoukankan      html  css  js  c++  java
  • 可查找重复元素的二分查找算法

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

    二分查找算法思想:又称为 折半查找,二分查找适合对已经排序好的数据集合进行查找。假设有一升序的数据集合,先找出升序集合中最中间的元素,将数据集合划分为两个子集,将最中间的元素和关键字key进行比较,如果等于key则返回;如果大于关键字key,则在前一个数据集合中查找;否则在后一个子集中查找,直到找到为止;如果没找到则返回-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、改进经典二分算法,二分查找是基于有序的数组,重复的元素都在一起。我们只需要在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;
    	}
    
    
  • 相关阅读:
    learnyou 相关网站
    hdu 3038 How Many Answers Are Wrong
    hdu 3047 Zjnu Stadium 并查集高级应用
    poj 1703 Find them, Catch them
    poj 1182 食物链 (带关系的并查集)
    hdu 1233 还是畅通工程
    hdu 1325 Is It A Tree?
    hdu 1856 More is better
    hdu 1272 小希的迷宫
    POJ – 2524 Ubiquitous Religions
  • 原文地址:https://www.cnblogs.com/qjmnong/p/9102795.html
Copyright © 2011-2022 走看看