二分查找法

有序数组查找

在一个有序数组中查找某个数字是否存在

首先看暴力解法(图片均为使用语雀画出)

二分查找法

public static int find(int[] array, int aim) {
    for (int i = 0; i < array.length; i++) {
        if (aim == array[i]) {
            return i;
        }
    }
    return -1;
}

二分查找

二分查找法

public static int find(int[] array, int aim) {
    // 初始化left = 最左侧, right = 最右侧
    int left = 0;
    int right = array.length - 1;

    // 当left > right则表示遍历完成
    while (left <= right) {
        // 获取中间的值
        int middle = (left + right) / 2;
        int middleValue = array[middle];
        if (middleValue == aim) {
            // 已经找到目标
            return middle;
        } else if (middleValue < aim) {
            // 目标在middle的右侧,重置left
            left = middle + 1;
        } else {
            // 目标在middle的左侧,重置right
            right = middle - 1;
        }
    }
    return -1;
}

时间复杂度明显减少

查找数组中重复的数字

假设给定一个数字数组里面的数字介于0~10之间,找出重复的数字

设置一个新的数组长度为11用于表示0~10这些数字是否存在数组中,存在一次相应的值+1.如图
二分查找法
数组中2,3,4存在则exists数组索引值为2,3,4的值由空变成1,所以要是出现重复的数字,则值>=1表示重复,根据上述思路完善代码

public static ArrayList<Integer> repeat(int[] array) {
    //设置动态数组更好处理结果
    ArrayList<Integer> result = new ArrayList<>();
    int[] exists = new int[11];
    for (int i = 0; i < array.length; i++) {
        int value = array[i];
        // 当前位置已经为1了表示重复所以加入结果数组中
        if (exists[value] == 1) {
            result.add(value);
        }
        // 用exists标示记录,每次出现值+1
        exists[value]++;
    }
    return result;
}
上一篇:微信小程序开发-IP地址查询-例子


下一篇:14个Xcode中常用的快捷键操作