记录一下学习的二分法
二分法适用于:
(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