【LeetCode 热题100】74:搜索二维矩阵(二分、线性两种方式 详细解析)(Go 语言实现)
🚀 力扣热题 74:搜索二维矩阵(详细解析)
📌 题目描述
力扣 74. 搜索二维矩阵
给你一个满足下述两条属性的
m x n整数矩阵matrix:
- 每行中的整数从左到右按非递减顺序排列。
- 每行的第一个整数大于前一行的最后一个整数。
给你一个整数
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.lengthn == matrix[i].length1 <= m, n <= 100-10^4 <= matrix[i][j], target <= 10^4
💡 解题思路
1. 观察矩阵特性
- 矩阵每行递增,且下一行的第一个元素大于上一行的最后一个元素。
- 可以将其视为一个 一维有序数组,索引从
0到m * n - 1,然后用 二分查找 解决。
2. 方法一:二分查找
- 视整个二维数组为一维数组,使用索引
mid,计算对应的二维坐标:row = mid // n (行号) col = mid % n (列号) - 进行标准的 二分查找:
- 如果
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. 方法二:逐行扫描 + 线性查找
- 遍历每一行,判断
target是否在当前行范围内(即row[0] <= target <= row[n-1])。 - 如果在范围内,则进行遍历查找。
- 适用于矩阵较小的情况,时间复杂度较高。
💻 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)),适用于大规模数据。
- 📌 方法二:逐行扫描 + 线性查找,适用于数据量较小的情况。
- 💡 掌握不同方法,有助于应对不同的面试场景!
👍 如果觉得有帮助,欢迎点赞、收藏、关注哦!
相关文章:
【LeetCode 热题100】74:搜索二维矩阵(二分、线性两种方式 详细解析)(Go 语言实现)
🚀 力扣热题 74:搜索二维矩阵(详细解析) 📌 题目描述 力扣 74. 搜索二维矩阵 给你一个满足下述两条属性的 m x n 整数矩阵 matrix : 每行中的整数从左到右按非递减顺序排列。每行的第一个整数大于前一行的…...
《Peephole LSTM:窥视孔连接如何开启性能提升之门》
在深度学习的领域中,长短期记忆网络(LSTM)以其出色的序列数据处理能力而备受瞩目。而Peephole LSTM作为LSTM的一种重要变体,通过引入窥视孔连接,进一步提升了模型的性能。那么,窥视孔连接究竟是如何发挥作用…...
HTML之JavaScript变量和数据类型
HTML之JavaScript变量和数据类型 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</titl…...
(少儿编程)关于讲解C++函数(认识,了解)的思考与总结
前言: 在少儿编程中,讲解函数的概念时,需要将复杂的概念简化,并通过生动有趣的例子和互动方式来帮助孩子理解。以下是一个适合少儿的函数讲解思路和示例: 用生活中的例子引入函数的概念: 目标:…...
【漫话机器学习系列】082.岭回归(或脊回归)中的α值(alpha in ridge regression)
岭回归(Ridge Regression)中的 α 值 岭回归(Ridge Regression)是一种 带有 L2 正则化 的线性回归方法,用于处理多重共线性(Multicollinearity)问题,提高模型的泛化能力。其中&am…...
Node.js怎么调用到打包的python文件呢
在 Node.js 中调用打包后的 Python 可执行文件(如 PyInstaller 生成的 .exe 或二进制文件),可以通过以下步骤实现: 一、Python 打包准备 假设已有打包好的 Python 文件 your_script.exe(以 Windows 为例)&…...
9 Pydantic复杂数据结构的处理
在构建现代 Web 应用时,我们往往需要处理复杂的输入和输出数据结构。例如,响应数据可能包含嵌套字典、列表、元组,甚至是多个嵌套对象。Pydantic 是一个强大的数据验证和序列化库,可以帮助我们轻松地处理这些复杂的数据结构&#…...
C++ decltype 规则推导
C decltype 规则推导 文章目录 C decltype 规则推导**1. 基本规则****(1) 如果 decltype 的参数是变量名(无括号的标识符)****(2) 如果 decltype 的参数是表达式(带括号或操作符)** **2. 与 auto 的区别****3. 特殊场景****(1) 函…...
Rust 测试组织指南:单元测试与集成测试
一、为什么要同时使用单元测试与集成测试 单元测试:更为精细、聚焦某一逻辑单元;可以调用到私有函数,快速定位错误根源。集成测试:作为“外部代码”来使用库的公开接口,测试多个模块间的交互,确保整体功能…...
Day62_补20250210_图论part6_108冗余连接|109.冗余连接II
Day62_20250210_图论part6_108冗余连接|109.冗余连接II 108冗余连接 【把题意转化为并查集问题】 题目 有一个图,它是一棵树,他是拥有 n 个节点(节点编号1到n)和 n - 1 条边的连通无环无向图(其实就是一个线形图&am…...
kafka消费端之消费者协调器和组协调器
文章目录 概述回顾历史老版本获取消费者变更老版本存在的问题 消费者协调器和组协调器新版如何解决老版本问题再均衡过程**第一阶段CFIND COORDINATOR****第二阶段(JOINGROUP)**选举消费组的lcader选举分区分配策略 第三阶段(SYNC GROUP&…...
语法备忘04:将 事件处理函数 绑定到 组件 的事件上
示例1:<Table OnQueryAsync"OnQueryAsync" /> 示例2:<Table OnQueryAsync"OnQueryAsync" /> 说明:这两种写法在功能上是完全相同的,都是在将 OnQueryAsync 事件处理函数绑定到 Table 组件的 …...
C++20中的std::atomic_ref
一、std::atomic_ref 我们在学习C11后的原子操作时,都需要提前定义好std::atomic变量,然后才可以在后续的应用程序中进行使用。原子操作的优势在很多场合下优势非常明显,所以这也使得很多开发者越来习惯使用原子变量。 但是,在实…...
CSS 相关知识
1、高度已知,三栏布局,左右宽度 200,中间自适应,如何实现? <body><div class"box"><div class"box1">高度已知</div><div class"box2">左右宽度 200&…...
RocketMQ、RabbitMQ、Kafka 的底层实现、功能异同、应用场景及技术选型分析
1️⃣ 引言 在现代分布式系统架构中,📩消息队列(MQ)是不可或缺的组件。它在系统🔗解耦、📉流量削峰、⏳异步处理等方面发挥着重要作用。目前,主流的消息队列系统包括 🚀RocketMQ、&…...
IDEA升级出现问题Failed to prepare an update Temp directory inside installation
IDEA升级出现问题"Failed to prepare an update Temp directory inside installation…" 问题来源: 之前修改了IDEA的默认配置文件路径,然后升级新版本时就无法升级,提示"Failed to prepare an update Temp directory insid…...
DeepSeek提示词手册
一、核心原则:基于DeepSeek的推理特性 自然语言优先undefinedDeepSeek擅长理解自然表达,无需复杂模板。例如: ❌旧模板:"你是专业分析师,需分三步回答,第一步…" ✅高效提问:"…...
基于UVM搭验证环境
基于UVM搭验证环境基本思路: 首先,我们搭建环境时一般都有一个目标的DUT。此时,我们可以结合所要验证的的模块、是否需要VIP、验证侧重点等在典型的UVM验证环境的基础上做适当调整后形成一个大体的环境架构。比如,需要一个ahb_vip…...
C++性能优化—人工底稿版
C以高性能著称,性能优化是C程序员绕不过去的一个话题,性能优化是一个复杂、全局而又细节的问题,本文总结C性能分析中常用的知识。 性能优化的时机 大部分关于性能优化的文章都强调:不要过早的进行性能优化。 C编码层面 数据结…...
Java 使用腾讯翻译 API 实现含 HTML 标签文本精准翻译工具
一、翻译标签文本工具 package org.springblade.common.utils;import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern;public class TencentTranslationForHTML {public static void main(String[] args) {Stri…...
十款开源的论坛建站工具
以下是十款开源的论坛建站工具,它们各具特色,能够满足不同用户的需求: Discuz!(Crossday Discuz! Board) 特点:基础架构采用web编程组合PHPMySQL,用户可以在不需要任何编程的基础上,…...
vue学习6
1. 智慧商城 1. 路由设计配置 单个页面,独立展示的,是一级路由 2.二级路由配置 规则&组件配置导航链接配置路由出口 <template><div id"app"><!--二级路由出口--><router-view></router-view><van-…...
线程池以及日志、线程总结
一、线程池以及日志 1、基础线程池写法 主线程在main函数中构建一个线程池,初始化(Init)后开始工作(Start) 此时线程池中每个线程都已经工作起来了,只是任务队列中任务为空,所有线程处于休眠状态(通过线程同步中的条件变量实现,…...
Vue 响应式渲染 - 过滤应用
Vue 渐进式JavaScript 框架 基于Vue2的学习笔记 - Vue响应式渲染综合 - 过滤应用 目录 过滤应用 引入vue Vue设置 设置页面元素 模糊查询过滤实现 函数表达式实现 总结 过滤应用 综合响应式渲染做一个输入框,用来实现;搜索输入框关键词符合列表。…...
【ThreeJS Basics 1-3】Hello ThreeJS,实现第一个场景
文章目录 环境创建一个项目安装依赖基础 Web 页面概念解释编写代码运行项目 环境 我的环境是 node version 22 创建一个项目 首先,新建一个空的文件夹,然后 npm init -y , 此时会快速生成好默认的 package.json 安装依赖 在新建的项目下用 npm 安装依…...
银行国际结算
银行国结项目,即国际结算项目,是银行业务中的重要组成部分,它涉及跨国界的货币收付和资金转移。 一、银行国结项目的定义 银行国结项目是指银行为国际贸易、投资等活动提供的国际结算服务,包括各种国际支付和资金清算业务。这些…...
Go语言构建微服务:从入门到实战
引言 在云原生时代,微服务架构已成为构建复杂分布式系统的首选方案。Go语言凭借其卓越的并发支持、简洁的语法和高效的运行时,成为微服务开发的利器。本文将深入探讨如何用Go构建健壮的微服务系统,并通过完整案例演示关键实现细节。 一、微…...
深入理解动态代理
为什么需要动态代理 对于代码的增强逻辑我们是清楚具体实现的,一种方式是增强逻辑作为委托类,被其他业务类调用, 这样会有很多重复代码,而且,当需要根据动态参数来决定增强逻辑时,重复代码会更多,逻辑会更不清晰 二,也是动态代理产生的原始需求,解决类爆照问题, 所以…...
私有属性和方法(python)
一、私有属性(属性名前面加两个短下划线) (一)私有属性与公有属性区别 公有属性:在类里面和外面均可以访问和修改 私有属性:需要用set方法才能修改,get方法才能访问 (二…...
Cherry Studio之DeepSeek联网/本地,建属于自己的AI助理!
上一篇文章,讲了DeepSeek-R1部署到本地的方法。这一篇文章,我们让DeepSeek再一次升级,通过图形化界面来交互,从而变成我们的AI助理,让DeepSeek R1发挥最大实力! 首选需要借助硅基流动的API接口,…...
