二分法学习以及经典面试题

记录一下学习的二分法

二分法适用于:
(1). 该数组数据量巨大;{2}. 该数组已经排序;(3). 一般要求找到的是某一个值
二分法的写法很多种掌握其中一种就行了

常规写法:

public Integer erfenfa(Integer target,Integer[] array) {
    	Integer min = 0;
    	Integer max = array.length-1;
    	while(min<=max){
    		Integer mid= (int) (Math.floor((max+min))/2);
    		if(array[mid].equals(target)) {
    			return mid;
    		}
    		if(target>array[mid]) {
    			min = mid+1;
    		}else{
    			max = mid-1;
    		}
    	}
    	return -1; 
    }

假如目前数组里面有重复值,并且要获得重复值里面最左边或者最右边的数的下标怎么办,这也是一道经典的二分法面试题目,可以传递一个flag 0表示得到最左边的数,1表示最右边的数。

实例代码:

    public Integer erfenfa(Integer target , Integer[] array,Integer flag) {
    	Integer min = 0;
    	Integer max = array.length-1 ;
    	int k=1;
    	if(target == array[0]&&flag == 0) {   //如果值出现在数组的最左边返回其下标
    		return 0;
    	}if(target == array[array.length-1]&&flag== 1) { //如果值出现在数组的最右边返回其下标
    		return array.length-1;
    	}
    	while(min<max) { 
    		Integer mid = (int) Math.round((max+min)/2.0);   //注意是+号
    		System.out.println("比较了"+k+"次");
    		k++; 
    		if(array[mid] .equals(target)) {  
    			if(flag == 0 && max!=1) {  //这里如果max为1的话会出现死循环Math.round会一直为1 不理解的可以debug模式一步步观察
    				max = mid;
    				continue;
    			}
    			if(flag == 1){
    				min = mid;
    			continue;
    			}
    		}if(array[mid] > target)      
    		    max = mid -1;
    		else
    			min =mid +1;
    		if(array[max] .equals(target)) {  
    			return max;
    		}
    	}
    	return -1;
    }

此方法测试很多组数据都可以得到正常得到下标,如果有误还望指正

深受启发的博客
本文参考http://hedengcheng.com/?p=595

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值