【LeetCode 热题100】74:搜索二维矩阵(二分、线性两种方式 详细解析)(Go 语言实现)

🚀 力扣热题 74:搜索二维矩阵(详细解析)

📌 题目描述

力扣 74. 搜索二维矩阵

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

  1. 每行中的整数从左到右按非递减顺序排列。
  2. 每行的第一个整数大于前一行的最后一个整数。

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

🎯 示例 1:

text 复制代码
输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
输出:true

🎯 示例 2:

text 复制代码
输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13
输出:false

✅ 提示:

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= m, n <= 100
  • -10^4 <= matrix[i][j], target <= 10^4

💡 解题思路

1. 观察矩阵特性

  • 矩阵每行递增,且下一行的第一个元素大于上一行的最后一个元素。
  • 可以将其视为一个 一维有序数组 ,索引从 0 到 m * n - 1,然后用 二分查找 解决。

2. 方法一:二分查找

  1. 视整个二维数组为一维数组,使用索引 mid,计算对应的二维坐标:

    text 复制代码
    row = mid // n  (行号)
    col = mid % n  (列号)
  2. 进行标准的 二分查找 :

    • 如果 matrix[row][col] == target,返回 true。
    • 如果 matrix[row][col] < target,移动左边界。
    • 如果 matrix[row][col] > target,移动右边界。
💻 Go 代码实现(方法一:二分查找)
go 复制代码
func searchMatrix(matrix [][]int, target int) bool {
    if len(matrix) == 0 || len(matrix[0]) == 0 {
        return false
    }
    
    m, n := len(matrix), len(matrix[0])
    left, right := 0, m*n-1
    
    for left <= right {
        mid := (left + right) / 2
        row, col := mid/n, mid%n
        
        if matrix[row][col] == target {
            return true
        } else if matrix[row][col] < target {
            left = mid + 1
        } else {
            right = mid - 1
        }
    }
    
    return false
}

3. 方法二:逐行扫描 + 线性查找

  1. 遍历每一行,判断 target 是否在当前行范围内(即 row[0] <= target <= row[n-1])。
  2. 如果在范围内,则进行遍历查找。
  3. 适用于矩阵较小的情况,时间复杂度较高。
💻 Go 代码实现(方法二:逐行扫描)
go 复制代码
func searchMatrix(matrix [][]int, target int) bool {
    for i := range matrix {
        num := matrix[i]
        if num[0] <= target && target <= num[len(num)-1] {
            for j := range num {
                if num[j] == target {
                    return true
                }
            }
        }
    }
    return false
}

⏳ 复杂度分析

方法 时间复杂度 空间复杂度 适用场景
🚀 二分查找 O ( log ⁡ ( m × n ) ) O(\log(m \times n)) O(log(m×n)) O ( 1 ) O(1) O(1) 适用于大规模矩阵搜索
📌 逐行扫描 O ( m × n ) O(m \times n) O(m×n) O ( 1 ) O(1) O(1) 适用于较小矩阵

🎯 总结

  • ✅ 方法一(推荐) :二分查找 ,时间复杂度 O ( log ⁡ ( m × n ) ) O(\log(m \times n)) O(log(m×n)),适用于大规模数据。
  • 📌 方法二 :逐行扫描 + 线性查找,适用于数据量较小的情况。
  • 💡 掌握不同方法,有助于应对不同的面试场景!

👍 如果觉得有帮助,欢迎点赞、收藏、关注哦!

相关推荐
I_belong_to_jesus2 小时前
C++关于分支预测的优化1
开发语言·c++·算法
Code_Solitude9 小时前
C语言动态内存 + 柔性数组 + 数组名退化
c语言·算法·柔性数组
上海潭龙东海科技有限公司9 小时前
客运站管控之动态孪生技术方案(新增一屏管控模块
数据仓库·人工智能·算法·重构·动态规划
文丑颜不良啊10 小时前
LeetCode2821~2840题目解析
java·leetcode
YLCHUP11 小时前
【思维&图论建模】题解:债权(debt)_图论_建模_思路转化_思维题目_C++算法竞赛
c++·笔记·算法·数学建模·贪心算法·深度优先·图论
思麟呀12 小时前
背包DP(01背包+完全背包)
c++·算法
笑容掩饰我的失落13 小时前
区块链从小白到精通(七):Solidity 语法精讲——数据类型、函数、修饰器与事件
算法·区块链·php·智能合约·哈希算法
Pniubi14 小时前
力扣24. 两两交换链表中的节点(递归)
算法·leetcode·链表
꧁细听勿语情꧂14 小时前
直接选择排序,堆排序,冒泡排序,递归快速排序、hoare版本、挖坑法、lomuto前后指针,非递归快速排序
c语言·开发语言·数据结构·算法