美团一面二分查找

美团面试二分查找简单实现

背景,社招一面:
算法第一题二分查找:给定一个有序数组,输入一个值返回当前值所在的数组下标,如果未查到返回-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;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值