hot100_搜索二维矩阵 II

题目

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

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

示例 1:

输入: matrix = \[1,4,7,11,15,2,5,8,12,19,3,6,9,16,22,10,13,14,17,24,18,21,23,26,30], target = 5

输出: true

示例 2:

输入: matrix = \[1,4,7,11,15,2,5,8,12,19,3,6,9,16,22,10,13,14,17,24,18,21,23,26,30], target = 20

输出: false


题解

暴力

核心思想

如果我们不管二维矩阵matrix的特性,我们可以直接遍历判断是否存在等于target的数。

代码

cpp 复制代码
class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        int n = matrix.size();
        int m = matrix[0].size();
        for(int i = 0; i < n; i++) {
            for(int j = 0; j < m; j++) {
                if(matrix[i][j] == target) return true;
            }
        }
        return false;
    }
};

时间复杂度: O ( n ⋅ m ) O(n \cdot m) O(n⋅m),n 行 m 列,全部遍历。

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


二分查找

核心思想

因为matrix的每一行都是升序的,因此我们可以二分查找每一行,判断该行是否出现target

代码

cpp 复制代码
class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        if(matrix.empty() || matrix[0].empty()) return false;
        int n = matrix.size();
        for(int i = 0; i < n; i++) {
            auto &row = matrix[i];
            int l = 0, r = row.size() - 1;
            while(l < r) {
                int mid = (l + r) / 2;
                if(row[mid] < target) l = mid + 1;
                else r = mid;
            }
            if(row[l] == target) return true;
        }
        return false;
    }
};

时间复杂度: O ( n log ⁡ m ) O(n\log m) O(nlogm),最多需要进行 n 次二分查找。

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


Z 字形查找(右上角 / 左下角起点)

核心思想

  • 右上角 作为起点:(i=0, j=n‑1)
    • matrix[i][j] == target:找到,返回 true
    • matrix[i][j] > target:目标一定不在当前这一列 → j‑‑(向左)
    • matrix[i][j] < target:目标一定不在当前这一行 → i++(向下)
  • 越界说明不存在,返回 false

为什么不选左上角?左上角向右、向下都变大,无法判断走哪边,不能直接排除行 / 列

代码

cpp 复制代码
class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        if(matrix.empty() || matrix[0].empty()) return false;
        int n = matrix.size();
        int m = matrix[0].size();
        int i = 0, j = m - 1;
        while(i < n && j >= 0) {
            if(matrix[i][j] == target) return true;
            else if(matrix[i][j] > target) j--;
            else i++;
        }
        return false;
    }
};

时间复杂度: O ( m + n ) O(m+n) O(m+n),每轮消去一行或者一列,最多走 m+n 步

空间复杂度: O ( 1 ) O(1) O(1),原地遍历


三种算法对比

算法 时间复杂度 空间复杂度 核心思想 优点 缺点 适用场景
暴力双重循环 O(n⋅m) O(1) 遍历矩阵全部元素 代码最简单,不会出错 完全没利用有序性质,大数据会超时 矩阵很小、面试仅作为暴力铺垫
逐行二分 O(nlogm) O(1) 每行内部有序,每行做二分 利用行有序,比暴力快 没有利用列有序,性能弱于 Z 字形 行数很少,列数很大
Z 字形查找 O(n+m) O(1) 从右上角出发,一次排除一整行 / 一整列 同时利用行、列有序,时间最优 思维需要转换,不能选左上角起点 通用,本题标准最优解

240. 搜索二维矩阵 II - 力扣(LeetCode)

相关推荐
Niuguangshuo27 分钟前
论文解读:CTC,端到端序列识别的开山之作
算法·语音识别
讳疾忌医丶1 小时前
深度拆解 RocksDB 内核:基于 C++17 的 FIFO 调度状态机与温度阶梯自愈设计
java·c++·算法·架构
高亦真1 小时前
今天是学习嵌入式的第37天
linux·学习·算法
罗西的思考3 小时前
[Agent Memory / 强化学习] MemPO源码学习笔记 --- (2)--- 训练
人工智能·算法·机器学习
深圳市方中禾科技4 小时前
FZH1625 LCD 驱动芯片深度评测与实战指南
算法·led
我不会起名字3225 小时前
一天一道算法题(34):回溯法的经典例题(子集)
java·数据结构·python·算法·golang·深度优先·力扣
huang5791476 小时前
哈希算法的抗碰撞机制与安全性增强策略4
算法
林浩杨_7 小时前
SIGIR 2026|南京大学:Video-GAR:“通过生成 Query 来验证视频语义理解”的生成增强范式
论文阅读·人工智能·算法
Elsa️7467 小时前
算法一周刷题总结
c++·算法
小小程序猴18 小时前
深圳乘路资讯AI培训怎么样?课程靠谱吗?——一套课程可信度评估模型与实证分析
人工智能·算法