2.1 查找(2)

作者: coderjiege | 来源:发表于2017-12-27 12:03 被阅读14次

    套路

    • 查找时:拒绝依次探查这种低效的做法,要么使用二分查找,要么使用哈希表一次查出结果。
    • 数列整体有序或者部分有序就要第一时间想到二分查找

    注意点

    • 二分查找写法按这种方式: int mid = low + (high - low) / 2; 防止因为 low + high 超出int值的范围而出错。

    目录

    • 二维数组中的查找
    • 数字在排序数组中出现的次数

    二维数组中的查找

    在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

    • 最优解:选择从左下角或右上角开始查找,每次没找到目标元素时可以直接排除一行或一列,从而在最短时间内得到结果
    public boolean Find(int target, int [][] array) {
        if (array == null || array[0] == null) {
            return false;
        }
        int rows = array.length, cols = array[0].length;
        int i = 0, j = cols - 1;
        while (i < rows && j >= 0) {
            if (target < array[i][j]) {
                j--;
            } else if (target > array[i][j]) {
                i++;
            } else {
                return true;
            }
        }
        return false;
    }
    

    数字在排序数组中出现的次数

    统计一个数字在排序数组中出现的次数。

    • 二分查找到其中一个k,再往左右探查,但是依然是挨个遍历,还不是最优。
    • 数组有序,二分查找找到第一个出现k的位置和最后一个出现k的位置,返回差+1即可。
    public int GetNumberOfK(int [] array , int k) {
        if (array == null || array.length == 0) {
            return 0;
        }
        int first = findFirstK(array, k, array.length - 1);
        int last = findLastK(array, k, array.length - 1);
        return first == -1 ? 0 : last - first + 1;
    }
    
    private int findFirstK(int[] array, int k, int last) {
        int low = 0, high = last;
        while (low <= high) {
            int mid = low + (high - low) / 2;
            if (array[mid] < k) {
                low = mid + 1;
            } else if (array[mid] == k && (mid == 0 || array[mid - 1] < array[mid])) {
                return mid;
            } else {
                high = mid - 1;
            }
        }
        return -1;
    }
    
    private int findLastK(int[] array, int k, int last) {
        int low = 0, high = last;
        while (low <= high) {
            int mid = low + (high - low) / 2;
            if (array[mid] > k) {
                high = mid - 1;
            } else if (array[mid] == k && (mid == last || array[mid] < array[mid + 1])) {
                return mid;
            } else {
                low = mid + 1;
            }
        }
        return -1;
    }
    

    相关文章

      网友评论

        本文标题:2.1 查找(2)

        本文链接:https://www.haomeiwen.com/subject/xrzygxtx.html