美团面试二分查找简单实现
背景,社招一面:
算法第一题二分查找:给定一个有序数组,输入一个值返回当前值所在的数组下标,如果未查到返回-1
首先思路是想一下二分法的实现方法,根据实现方法理清楚自己的思路:给定有序数组, 循环之前拿到数组最大值和最小值,判断如果num<=array[max] 在while里面循环比较查找,num与得到的中间值做比较,如果num>array[val] 那么就把中间数赋值给最小值,并且数组下标也赋值成中间值即: array[min] = array[val],min = val,反之则赋值给最大值, array[max] = array[val];//需要先赋值, max = val;//然后在更改数组下标
代码如下:
public static void main(String[] args) {
System.out.println(binSearch(new int[]{1, 2, 3, 4, 5, 76, 89, 345, 4567}, 2));
}
/**
* @MethodName: binSearch---> Binary Search
* @Description:
* @Param: [array, num]
* @Return: int
* @Author: gjq
* @Date: 2020/5/20
**/
private static int binSearch(int[] array, int num) {
int min = 0;
int max = array.length - 1;
while (num <= array[max]) {
int val = (min + max) >>> 1;
if(num < array[val]){
array[max] = array[val];//需要先赋值
max = val;
}else if (num > array[val]) {
array[min] = array[val];
min = val;
}else{
return val;
}
}
return -1;
}
```java
代码优化:
/**
* @return
* @description 给定一个数组,一个数组查找这个数字再数组中的位置,没有返回-1
* 二分查找的思路:获取数组的中间值,判断当前值与中间值进行比较
* 如果当前值大于中间值,那么再中间值与最大值之间查找,把中间值赋值给最小值
* 如果当前值小于中间值,那么再中间值与最小值之间查找,
*/
public static int binserch(int[] arrays, int num) {
int min = 0, max = arrays.length - 1;
while (num <= arrays[max]) {
int val = (min + max) >>> 1;//数组长度无符号右移1位相当于向下取余
if (num == arrays[val]) {//与中位数相等返回下标
return val;
}
if (num > arrays[val]) {//大于中位数
min = val + 1; //中位数下标+1,赋值给最小值
} else {
max = val - 1;//小于中位,中位数下标左移赋值给最大值
if (max < 0) return -1;//最大值小于零说明提供数值小于数组最小值
}
}
return -1;
}