搜索二维矩阵

172 阅读1分钟

题目

image.png

二分查找

    public boolean searchMatrix(int[][] matrix, int target) {

        // 判断目标值是否在矩阵内
        if(target < matrix[0][0] || target > matrix[matrix.length - 1][matrix[0].length - 1]) {
            return Boolean.FALSE;
        }

        // 以第一列为基准, 寻找target在哪一行
        int row = erfen(matrix, target) - 1;

        // 在这一行寻找target
        return erfetn(matrix[row], target);



    }

    public boolean erfetn(int [] nums, int target) {
        int left = 0;
        int right = nums.length - 1;
        int mid;
        while (left <= right) {
            mid = left + (right - left) / 2;
            if (nums[mid] == target) {
                return Boolean.TRUE;
            }
            if (nums[mid] > target) {
                right = mid - 1;
            }
            if (nums[mid] < target) {
                left = mid + 1;
            }
        }
        return Boolean.FALSE;
    }

    public int erfen(int [][] matrix, int target) {
        int left = 0;
        int right = matrix.length - 1;
        // 寻找左边界

        while (left <= right) {
            int mid = left + (right - left) / 2;
            if (matrix[mid][0] == target) {
                return = mid + 1;
            }
            if (matrix[mid][0] > target) {
                right = mid - 1;
            }
            if (matrix[mid][0] < target) {
                left = mid + 1;
            }
        }
        return left;
    }

思路

(1) 先判断目标元素是否在二维数组范围内

(2) 按第一列进行左边界的二分查找, 寻找元素在哪一行

(3) 在那一行进行二分查找, 寻找目标元素

(4) 需要注意二分查找, 寻找左边界的写法