【二分查找】Leetcode 74. 搜索二维矩阵【中等】

搜索二维矩阵

给你一个满足下述两条属性的 m x n 整数矩阵:

  • 每行中的整数从左到右按非严格递增顺序排列。
  • 每行的第一个整数大于前一行的最后一个整数。

给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false 。

示例 1:

输入 :matrix = \[1,3,5,7,10,11,16,20,23,30,34,60], target = 3
输出:true

解题思路1

  • 1、从矩阵的右上角开始查找。
  • 2、如果当前元素等于目标值,则返回true。
  • 3、如果当前元素大于目标值,则说明目标值在当前元素的左侧列,列索引减1。
  • 4、如果当前元素小于目标值,则说明目标值在当前元素的下方行,行索引加1。
  • 5、重复步骤2-4,直到找到目标值或者超出矩阵边界。

Java实现1

java 复制代码
public class SearchMatrix {

    public boolean searchMatrix(int[][] matrix, int target) {
        if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
            return false;
        }

        int rows = matrix.length;
        int cols = matrix[0].length;
        int row = 0;
        int col = cols - 1;

        while (row < rows && col >= 0) {
            if (matrix[row][col] == target) {
                return true;
            } else if (matrix[row][col] > target) {
                col--;
            } else {
                row++;
            }
        }

        return false;
    }

    public static void main(String[] args) {
        SearchMatrix solution = new SearchMatrix();
        int[][] matrix = {{1,3,5,7},{10,11,16,20},{23,30,34,60}};
        int target = 34;
        System.out.println("Target exists: " + solution.searchMatrix(matrix, target)); // Output: true
    }
}

时间空间复杂度1

  • 时间复杂度:O(m + n),其中m为矩阵的行数,n为矩阵的列数。因为每次迭代都会将行索引或列索引移动一次,最多移动m + n次。

  • 空间复杂度:O(1)。

解题思路2

  • 1、首先对第一列进行二分查找,找到最后一个小于等于 target 的元素所在的行。
  • 2、在找到的行中进行二分查找,确定 target 是否在该行中。

Java实现2

java 复制代码
public class SearchMatrix {

    public boolean searchMatrix(int[][] matrix, int target) {
        int m = matrix.length;
        int n = matrix[0].length;

         二分查找第一列,找到最后一个小于等于 target 的元素所在的行
        int left = 0;
        int right = m - 1;
        while (left <= right) {
            int mid =  (left + right ) / 2;
            if (matrix[mid][0] == target) {
                return true;
            } else if (matrix[mid][0] < target) {
                left = mid + 1;
            } else {
                right = mid - 1;
            }
        }

        // 如果目标值不在矩阵的第一列,则在确定的行中继续进行二分查找
        if (right >= 0) {
            //确定搜索行数
            int row = right;
            left = 0;
            right = n - 1;
            while (left <= right) {
                int mid =  (left + right ) / 2;
                if (matrix[row][mid] == target) {
                    return true;
                } else if (matrix[row][mid] < target) {
                    left = mid + 1;
                } else {
                    right = mid - 1;
                }
            }
        }

        return false;
    }

    public static void main(String[] args) {
        SearchMatrix solution = new SearchMatrix();
        int[][] matrix = {{1,3,5,7},{10,11,16,20},{23,30,34,60}};
        int target = 34;
        System.out.println("Target exists: " + solution.searchMatrix(matrix, target)); // Output: true
    }
}

时间空间复杂度2

  • 时间复杂度为 O(log m + log n),其中 n 是矩阵的列数,m 是矩阵的行数。
  • 空间复杂度:O(1)。
相关推荐
贝壳69011 分钟前
一个2026年2月才上传的库,凭什么敢碰2009年就有人写烂的题目
算法
文丑颜不良啊35 分钟前
LeetCode2901~2920题目解析
java·leetcode
贝壳6901 小时前
同一道三亿位选型题,三个AI给了我三个答案,我把它们拉进同一台机器复跑
算法
文丑颜不良啊3 小时前
LeetCode2861~2880题目解析
java·leetcode
青少儿编程课堂3 小时前
蓝桥杯青少组图形化 + 全国青少年信息素养大赛 + 电子学会图形化考级:校园大富翁经营闯关解析
c++·python·算法·bfs·信息学竞赛
在所不辞兄4 小时前
为什么在新能源汽车电驱与热管理开发中,AI驱动的数字孪生和数据驱动仿真正在部分替代对物理台架与实车标定的依赖?
人工智能·深度学习·神经网络·算法·机器学习
I_belong_to_jesus14 小时前
C++关于分支预测的优化1
开发语言·c++·算法
Code_Solitude21 小时前
C语言动态内存 + 柔性数组 + 数组名退化
c语言·算法·柔性数组
上海潭龙东海科技有限公司21 小时前
客运站管控之动态孪生技术方案(新增一屏管控模块
数据仓库·人工智能·算法·重构·动态规划