二分查找:又称折半查找,要求带查找的序列有序(递增或递减的旋转数组也可以)。可以根据字面意思理解二分查找的核心思想就是把数组分区,首先定义一个左指针left(数组第一个元素的下标)和一个右指针right(数组末元素下表),之后计算数组中间位置的指针mid(mid=left+(right-left)/2)进行分区,第一次分区结束后进行判断,假设是一个递增的数组,如果待查关键字大于mid所指的元素则在后半段进行查找,如果小于则在前半段进行查找,此时left=mid或right=mid再进行新一轮的分区直到找到待查关键字。
下面是一个例题:
链接:https://www.nowcoder.com/questionTerminal/9f3231a991af4f55b95579b44b7a01ba?toCommentId=5357527
来源:牛客网
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。
输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。
例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
public class Swordquest6 {
public int minNumberInRotateArray(int [] array) {//原始的方法
if(array.length==0){
return 0;
}
int key=array[1];
for(int i= array.length-1;i>0;i--){
if(array[i]<array[i-1]){
key=array[i];
break;
}
}
return key;
}
public int minNumberInRotateArray1(int [] array) {//二分查找
if(array.length==0){
return 0;
}
int left=0;
int right=array.length-1;
int mid=-1;
while(array[left]>=array[right]){//根据旋转数组的特性 定义好循环条件
if(right-left==1){
mid=right;
break;
}
mid=left+(right-left)/2;
if(array[left]<=array[mid]){
left=mid;
}
if(array[right]>=array[mid]){
right=mid;
}
}
return array[mid];
}
}