【LeetCode 热题100】240:搜索二维矩阵 II(详细解析)(Go语言版)

🚀 力扣 240:搜索二维矩阵 II(详细解析)

📌 题目描述

力扣 240. 搜索二维矩阵 II

编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target

该矩阵具有以下特性:

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

🎯 示例 1:

go 复制代码
输入: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:

go 复制代码
输入: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

💡 解题思路

✅ 方法一:从右上角开始搜索(Z 字形查找)

注:该图来自于力扣题解

我们利用矩阵的有序性,从 右上角 开始:

  • 若当前元素等于 target ,返回 true
  • 若当前元素大于 target ,说明 target 在当前列的左侧,列索引 col--
  • 若当前元素小于 target ,说明 target 在当前行的下方,行索引 row++

🔹 代码实现:

go 复制代码
func searchMatrix(matrix [][]int, target int) bool {
    if len(matrix) == 0 || len(matrix[0]) == 0 {
        return false
    }
    
    rows, cols := len(matrix), len(matrix[0])
    row, col := 0, cols-1
    
    for row < rows && col >= 0 {
        if matrix[row][col] == target {
            return true
        } else if matrix[row][col] > target {
            col--
        } else {
            row++
        }
    }
    return false
}

⏳ 复杂度分析:

  • 时间复杂度: O ( m + n ) O(m + n) O(m+n),最多遍历 m + n 次。
  • 空间复杂度: O ( 1 ) O(1) O(1),仅使用常数额外空间。

✅ 方法二:二分查找

我们可以对每一行使用 二分查找

  • 在每一行上进行 O(log n) 的搜索,总共 m 行。
  • 总时间复杂度: O ( m log ⁡ n ) O(m \log n) O(mlogn)。

🔹 代码实现:

go 复制代码
func binarySearch(row []int, target int) bool {
    left, right := 0, len(row)-1
    for left <= right {
        mid := left + (right-left)/2
        if row[mid] == target {
            return true
        } else if row[mid] < target {
            left = mid + 1
        } else {
            right = mid - 1
        }
    }
    return false
}

func searchMatrix(matrix [][]int, target int) bool {
    for _, row := range matrix {
        if binarySearch(row, target) {
            return true
        }
    }
    return false
}

⏳ 复杂度分析:

  • 时间复杂度 : O ( m log ⁡ n ) O(m \log n) O(mlogn),对每一行进行 O ( log ⁡ n ) O(\log n) O(logn) 的搜索。
  • 空间复杂度 : O ( 1 ) O(1) O(1),仅使用常数额外空间。

📌 方法对比

方法 时间复杂度 空间复杂度 适用场景
Z 字形查找 O ( m + n ) O(m + n) O(m+n) O ( 1 ) O(1) O(1) 适用于所有情况
二分查找 O ( m log ⁡ n ) O(m \log n) O(mlogn) O ( 1 ) O(1) O(1) 适用于行数较少但列数较多的情况

🎯 总结

  • 方法一(Z 字形查找) 是最优解,利用矩阵的有序性进行高效搜索。
  • 方法二(二分查找) 在某些情况下也适用,但通常不如 O(m + n) 的解法高效。
  • ✅ 该题考察 矩阵搜索技巧 ,类似题型包括:
    • 力扣 74. 搜索二维矩阵(每行是升序数组)
    • 力扣 378. 有序矩阵中第 K 小的元素(使用堆或二分查找)

💡 如果觉得这篇文章对你有帮助,欢迎点赞 👍、收藏 ⭐、关注 💻,持续分享更多高质量算法题解析!🎯🚀📌

相关推荐
khalil102018 分钟前
代码随想录算法训练营Day-50 图论02 | 99.岛屿数量-深搜、99.岛屿数量-广搜 、100.岛屿的最大面积
数据结构·c++·算法·leetcode·深度优先·图论
承渊政道31 分钟前
【贪心算法】(经典实战应用解析(二):最⻓递增⼦序列、递增的三元⼦序列、最⻓连续递增序列、买卖股票的最佳时机、买卖股票的最佳时机II)
数据结构·c++·学习·算法·leetcode·贪心算法·哈希算法
covco38 分钟前
端云协同架构下:AI 原生矩阵系统端侧推理与离线生产技术实践
人工智能·矩阵·架构
洛水水40 分钟前
【力扣100题】42.杨辉三角
算法·leetcode·职场和发展
covco9 小时前
矩阵管理系统指南:拆解星链引擎的架构设计与全链路落地实践
大数据·人工智能·矩阵
吴声子夜歌11 小时前
Go——并发编程
开发语言·后端·golang
covco11 小时前
分布式架构实战:全平台矩阵管理系统的技术实现与性能优化
分布式·矩阵·架构
如何原谅奋力过但无声12 小时前
【灵神高频面试题合集06-08】反转链表、快慢指针(环形链表/重排链表)、前后指针(删除链表/链表去重)
数据结构·python·算法·leetcode·链表
geovindu14 小时前
go: Lock/Mutex Pattern
开发语言·后端·设计模式·golang·互斥锁模式
sheeta199818 小时前
LeetCode 每日一题笔记 日期:2026.05.12 题目:1665. 完成所有任务的最少初始能量
笔记·算法·leetcode