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;
    	}
    
    
  • 相关阅读:
    转:va_list、va_start、va_arg、va_end的原理与使用
    学习Docker的记录
    Google Code 优秀的开源工具
    转载(程序在内存中运行的奥秘)
    C# 和 Java 之争之我见
    揭秘ASP.NET 2.0的Eval方法(转)
    IIS6.0 架构(二)
    IE6 position:fixed bug (固定窗口方法)(转载)
    用FileStream上传图片转换成二进制,在本地用行,传到服务器上去出现如下错误
    异常处理
  • 原文地址:https://www.cnblogs.com/qjmnong/p/9102795.html
Copyright © 2011-2022 走看看