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

news/2025/2/12 0:57:53/

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

📌 题目描述

力扣 74. 搜索二维矩阵

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

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

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

🎯 示例 1:

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

🎯 示例 2:

输入: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. 观察矩阵特性

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

2. 方法一:二分查找

  1. 视整个二维数组为一维数组,使用索引 mid,计算对应的二维坐标:
    row = mid // n  (行号)
    col = mid % n  (列号)
    
  2. 进行标准的 二分查找
    • 如果 matrix[row][col] == target,返回 true
    • 如果 matrix[row][col] < target,移动左边界。
    • 如果 matrix[row][col] > target,移动右边界。
💻 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-1for left <= right {mid := (left + right) / 2row, col := mid/n, mid%nif 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 代码实现(方法二:逐行扫描)
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)),适用于大规模数据。
  • 📌 方法二逐行扫描 + 线性查找,适用于数据量较小的情况。
  • 💡 掌握不同方法,有助于应对不同的面试场景!

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


http://www.ppmy.cn/news/1571285.html

相关文章

LSSVM最小二乘支持向量机多变量多步光伏功率预测(Matlab)

代码下载&#xff1a;LSSVM最小二乘支持向量机多变量多步光伏功率预测&#xff08;Matlab&#xff09; LSSVM最小二乘支持向量机多变量多步光伏功率预测 一、引言 1.1、研究背景与意义 随着全球能源危机和环境问题的日益严重&#xff0c;可再生能源的开发利用成为了世界各国…

Day62_补20250210_图论part6_108冗余连接|109.冗余连接II

Day62_20250210_图论part6_108冗余连接|109.冗余连接II 108冗余连接 【把题意转化为并查集问题】 题目 有一个图&#xff0c;它是一棵树&#xff0c;他是拥有 n 个节点&#xff08;节点编号1到n&#xff09;和 n - 1 条边的连通无环无向图&#xff08;其实就是一个线形图&am…

Vue 3 30天精进之旅:Day 16 - 组合式API进阶

友情提示&#xff1a;本文内容全部由 银河易创&#xff08;https://ai.eaigx.com&#xff09;AI创作平台生成&#xff0c;仅供参考。请根据具体情况和需求进行适当的调整和验证。 欢迎来到“Vue 3 30天精进之旅”的第16天&#xff01;今天我们将深入探讨 组合式API 的进阶用法&…

如何在WPS和Word/Excel中直接使用DeepSeek功能

以下是将DeepSeek功能集成到WPS中的详细步骤&#xff0c;无需本地部署模型&#xff0c;直接通过官网连接使用&#xff1a;1. 下载并安装OfficeAI插件 &#xff08;1&#xff09;访问OfficeAI插件下载地址&#xff1a;OfficeAI助手 - 免费办公智能AI助手, AI写作&#xff0c;下载…

matlab simulink 船舶模糊pid控制仿真

1、内容简介 略 matlab simulink 118-船舶模糊pid控制仿真 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略 基于船舶运动控制的Matlab仿真.pdf

Linux系统编程之信号基础知识

概述 信号是Linux系统中用于进程间通信的一种机制&#xff0c;允许一个进程通知另一个进程发生了某些特定事件。信号可以来自硬件中断、用户输入&#xff0c;也可以来自其他进程或者内核本身。信号是一种异步通知机制&#xff0c;当某个事件发生时&#xff0c;操作系统会向目标…

【小鱼闪闪】自制物联网测温小程序远程监测温度(图文)

小飞鱼之前写过一个将测温元件读取数据后写入到本地服务器的程序&#xff0c;可是这样有一个缺点就是只能局限于局域网来查询数据&#xff0c;而对于在办公楼外就不能查看数据。为了解决这个问题&#xff0c;今天小飞鱼做了一个可以将温度数据写入到云端的程序&#xff0c;再通…

【漫话机器学习系列】086.机器学习中的能力(Capacity)

机器学习中的能力&#xff08;Capacity&#xff09; 1. 引言 在机器学习中&#xff0c;模型的能力&#xff08;Capacity&#xff09;是一个重要的概念&#xff0c;它决定了模型能够学习的函数复杂度。简单来说&#xff0c;能力衡量了一个模型拟合不同函数的能力。能力越强的模…