【二分查找】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)。
相关推荐
久菜盒子工作室11 分钟前
量化金融|基于算法和模型的预测研究综述
算法·金融
CoovallyAIHub42 分钟前
SBP-YOLO:面向嵌入式悬架的轻量实时模型,实现减速带与坑洼高精度检测
深度学习·算法·计算机视觉
CoovallyAIHub1 小时前
医药、零件、饮料瓶盖……SuperSimpleNet让质检“即插即用”
深度学习·算法·计算机视觉
dragoooon341 小时前
[优选算法专题二滑动窗口——串联所有单词的子串]
数据结构·c++·学习·算法·leetcode·学习方法
刃神太酷啦1 小时前
C++ 异常处理机制:从基础到实践的全面解析----《Hello C++ Wrold!》(20)--(C/C++)
java·c语言·开发语言·c++·qt·算法·leetcode
十子木1 小时前
线性方程求解器的矩阵分裂
线性代数·矩阵
Brookty2 小时前
【算法】双指针(二)复写零
学习·算法
胖达不服输2 小时前
「日拱一码」081 机器学习——梯度增强特征选择GBFS
人工智能·python·算法·机器学习·梯度增强特征选择·gbfs
初级炼丹师(爱说实话版)3 小时前
2025算法八股——深度学习——优化器小结
人工智能·深度学习·算法
努力的小帅3 小时前
C++_哈希
开发语言·c++·学习·算法·哈希算法·散列表