当前位置: 首页 > news >正文

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

🚀 力扣热题 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.lryc.cn/news/534621.html

相关文章:

  • 元数据、数据元、数据元素、数据项 和 主数据的概念
  • 阿里云cdn怎样设置图片压缩
  • 白话文实战Nacos(保姆级教程)
  • 7. 基于DeepSeek和智谱清言实现RAG问答
  • 【数据结构】双向链表(真正的零基础)
  • 【生产变更】- Oracle RAC添加配置ipv6地址
  • Ai无限免费生成高质量ppt教程(deepseek+kimi)
  • python全栈-python基础
  • Python 鼠标轨迹 - 防止游戏检测
  • 力扣 零钱兑换
  • C# OpenCV机器视觉:OSTU算法实现背景差分的自适应分割
  • 快速搭建 Elasticsearch 8 集群:零基础实战与升级注意事项
  • 基于扑克牌分发效果制作时的问题总结
  • 老榕树的Java专题:Redis 从入门到实践
  • 【玩转 Postman 接口测试与开发2_019】第15章:利用 Postman 初探 API 性能测试(含实战截图)
  • 在 Qt 开发中,可以将 QML 封装成库
  • 换电脑了如何快速导出vscode里的插件
  • 点大商城V2-2.6.6源码全开源uniapp +搭建教程
  • 9 Pydantic复杂数据结构的处理
  • springboot+redis实现将树形结构存储到redis
  • 6、使用one-api管理统一管理大模型,并开始使用本地大模型
  • Windows安装Lyx
  • 一文讲透大模型部署工具ollama--结合本地化部署deepseek实战
  • 网络防御高级
  • 使用PyCharm进行Django项目开发环境搭建
  • 如何定义“破坏环境”
  • 现代前端开发的演进与未来趋势:从工具革新到技术突破
  • 活动预告 |【Part1】Microsoft 安全在线技术公开课:安全性、合规性和身份基础知识
  • idea Ai工具通义灵码,Copilot我的使用方法以及比较
  • 【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter8-对象、类与面向对象编程