题目:74. 搜索二维矩阵

题目描述

编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:
每行中的整数从左到右按升序排列。
每行的第一个整数大于前一行的最后一个整数。

方式一:简单做法暴力破解

 public boolean searchMatrix(int[][] matrix, int target) {
        if (matrix == null) {
            return false;
        }
        for (int i = 0; i < matrix.length; i++) {
            for (int j = 0; j < matrix[i].length; j++) {
                if (matrix[i][j] == target) {
                    return true;
                }
            }
        }
        return false;
    }

方式二:夹逼法不断缩小范围

由题意可以知道改矩阵是排序好的矩阵,所以可以通过 夹逼法 来不断缩小范围,在进行查找

    public boolean searchMatrix(int[][] matrix, int target) {
        if (matrix == null) {
            return false;
        }
        //定义函数
        int row = matrix.length;
        for (int i = 0; i < row; ) {
            //定义列数
            int col = matrix[i].length;
            //锁定行范围
            if (matrix[i][col - 1] >= target) {
                //遍历所在行,查找元素
                for (int j = 0; j < col; ) {
                    if (matrix[i][j] < target) {
                        j++;
                    } else if (matrix[i][j] == target) {
                        return true;
                    } else {
                        return false;
                    }
                }
            } else {
                i++;
            }
        }
        return false;
    }

方式三:二分查找,排序好的数组,使用二分查找效率最高

 public boolean searchMatrix(int[][] matrix, int target) {
        if (matrix == null) {
            return false;
        }
        //定义行数
        int row = matrix.length;
        for (int i = 0; i < row; i++) {
            int col = matrix[i].length;
            //锁定范围,进行二分查找(二分查找的前提,必须是有序的)
            if (matrix[i][col - 1] >= target) {
                int begin = 0;
                int end = col - 1;
                int mid = 0;
                while (begin <= end) {
                    mid = (begin + end) >> 1;
                    if (matrix[i][mid] < target) {
                        begin = mid + 1;
                    } else if (matrix[i][mid] == target) {
                        return true;
                    } else {
                        end = mid - 1;
                    }
                }
            }
        }
        return false;
    }
posted @ 2021-03-30 10:51  迁承_0204  阅读(47)  评论(0编辑  收藏  举报