240. 搜索二维矩阵 II

编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:

每行的元素从左到右升序排列。
每列的元素从上到下升序排列。

该题目解法大概分为3种
1、普通暴力搜索
2、利用数组排序特性:利用二分法和区域分割确定值


class Solution {
       public boolean searchMatrix(int[][] matrix, int target) {
        if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
            return false;
        }
        int [][] inputMatrix = matrix;
        int inputTarget = target;
        if (matrix[0].length == 1 && matrix.length == 1 )return target == matrix[0][0];
        return search(inputMatrix, inputTarget, 0,matrix[0].length  - 1, 0, matrix.length - 1);
    }

    private boolean search(int[][] inputMatrix, int inputTarget, int left, int right, int up, int down) {
        if (left > right || up > down || inputTarget < inputMatrix[up][left] || inputTarget > inputMatrix[down][right]) return false;
        int mid_y  = up + (down - up) / 2;
        int mid_x = binarySearch(inputMatrix[mid_y], left, right,inputTarget);
        if (mid_x  == -2) return true;
        return search(inputMatrix, inputTarget, left,mid_x, mid_y + 1, down)
                ||search(inputMatrix, inputTarget, mid_x + 1,right, up, mid_y);

    }

    private int binarySearch(int[] arr, int left, int right,int target) {
        int mid = 0;
        while (left <= right){
            mid = (left + right) / 2;
            if (arr[mid] == target) return -2;
            else if (target < arr[mid]){
                right = mid - 1;
            }else{
                left = mid + 1;
            }
        }
        return right;
    }
}

3:巧解: 从右上角或左下角开始锁定


class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        // start our "pointer" in the bottom-left
        int row = matrix.length-1;
        int col = 0;

        while (row >= 0 && col < matrix[0].length) {
            if (matrix[row][col] > target) {
                row--;
            } else if (matrix[row][col] < target) {
                col++;
            } else { // found it
                return true;
            }
        }

        return false;
    }
}

posted @ 2021-01-02 16:46  backTraced  阅读(56)  评论(0)    收藏  举报