LeetCode 热题 100 74. 搜索二维矩阵

LeetCode 热题 100 | 74. 搜索二维矩阵

大家好,今天我们来解决一道经典的算法题——搜索二维矩阵。这道题在 LeetCode 上被标记为中等难度,要求我们在一个满足特定条件的二维矩阵中查找一个目标值。如果目标值在矩阵中,返回 true;否则,返回 false。下面我将详细讲解解题思路,并附上 Python 代码实现。


问题描述

给定一个满足以下两个条件的 m x n 整数矩阵:

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

你需要判断一个整数 target 是否在矩阵中。

示例 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

解题思路

核心思想
  1. 二分查找

    • 由于矩阵的每一行都是有序的,并且每行的第一个元素大于前一行的最后一个元素,整个矩阵可以看作是一个一维有序数组。
    • 因此,可以使用二分查找来高效地查找目标值。
  2. 映射二维索引到一维索引

    • 将二维矩阵的索引映射到一维数组的索引,方便进行二分查找。

Python代码实现

def searchMatrix(matrix, target):""":type matrix: List[List[int]]:type target: int:rtype: bool"""if not matrix or not matrix[0]:return Falsem, n = len(matrix), len(matrix[0])  # 获取矩阵的行数和列数left, right = 0, m * n - 1  # 初始化二分查找的左右边界while left <= right:mid = (left + right) // 2  # 计算中间索引mid_value = matrix[mid // n][mid % n]  # 将一维索引映射到二维索引if mid_value == target:return True  # 找到目标值,返回 Trueelif mid_value < target:left = mid + 1  # 目标值在右侧,移动左边界else:right = mid - 1  # 目标值在左侧,移动右边界return False  # 未找到目标值,返回 False# 测试示例
print(searchMatrix([[1,3,5,7],[10,11,16,20],[23,30,34,60]], 3))  # 输出: True
print(searchMatrix([[1,3,5,7],[10,11,16,20],[23,30,34,60]], 13))  # 输出: False

代码解析

  1. 初始化边界

    • left 初始化为 0,right 初始化为矩阵的最后一个元素的索引 m * n - 1
  2. 二分查找

    • left <= right 的范围内,计算中间索引 mid
    • 将一维索引 mid 映射到二维索引 matrix[mid // n][mid % n]
    • 如果 mid_value 等于目标值,直接返回 True
    • 如果 mid_value 小于目标值,说明目标值在右侧,将 left 移动到 mid + 1
    • 如果 mid_value 大于目标值,说明目标值在左侧,将 right 移动到 mid - 1
  3. 返回结果

    • 如果未找到目标值,循环结束后返回 False

复杂度分析

  • 时间复杂度:O(log(m * n)),其中 m 是矩阵的行数,n 是矩阵的列数。二分查找的时间复杂度为 O(log(m * n))。
  • 空间复杂度:O(1),只使用了常数个额外空间。

示例运行

示例 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

总结

通过将二维矩阵的索引映射到一维索引,我们可以使用二分查找高效地查找目标值。这种方法不仅简洁,而且效率非常高,适合处理类似的问题。希望这篇题解对大家有所帮助,如果有任何问题,欢迎在评论区留言讨论!

关注我,获取更多算法题解和编程技巧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/news/908398.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在 HTML 中添加按钮

原文&#xff1a;如何在 HTML 中添加按钮 | w3cschool笔记 &#xff08;请勿将文章标记为付费&#xff01;&#xff01;&#xff01;&#xff01;&#xff09; 在网页开发中&#xff0c;按钮是用户界面中不可或缺的元素之一。无论是用于提交表单、触发动作还是导航&#xff0…

一篇文章实现Android图片拼接并保存至相册

系列文章目录 一篇文章实现Android图片拼接并保存至相册 文章目录 系列文章目录前言实现功能类定义和成员变量onCreate方法权限检查和图片选择处理选择的图片图片拼接功能图片保存功能 使用ImageStitcher类拼接图片代码解释&#xff1a;ImageStitcher.java类定义和方法计算拼接…

2025.06.06【Ribo-seq】|riboWaltz:P-site定位与三碱基周期性分析流程

文章目录 一、前言二、riboWaltz简介三、安装与依赖四、分析流程总览1. 数据准备2. 典型分析流程2.1 读取注释和BAM2.2 P-site定位2.3 三碱基周期性与元分析2.4 密码子使用偏好分析 五、可视化与结果解读六、常见问题与注意事项七、实战经验与建议八、参考资料九、结语 一、前言…

思维链的 内部机制和简单理解

思维链的 内部机制和简单理解 思维链是对解决问题的步骤进行规划,规划后将作为上下文 在LLM中继续输出。因为Transform都是一个一个单词生成,没新生成一个单词都会将新生的作为上下文。 可以这么理解,但更准确的简化描述是: 思维链是让模型在回答问题时,先“内部生成”或…

Charles 全流程指南:安装、设置、抓包与注意事项

Charles 是一款功能强大的网络抓包工具&#xff0c;支持 HTTP/HTTPS 流量监控、请求/响应分析、断点调试等功能。本文将从安装到实战抓包&#xff0c;提供完整流程及关键注意事项。 一、安装 Charles 官网下载&#xff1a;访问 Charles 官网&#xff0c;选择对应系统版本&…

全球长序列高分辨率光合有效辐射(PAR)(1984-2018)

时间分辨率&#xff1a;时空间分辨率&#xff1a;1km - 10km共享方式&#xff1a;开放获取数据大小&#xff1a;188.92 GB数据时间范围&#xff1a;1984-01-01 — 2018-12-31元数据更新时间&#xff1a;2022-04-29 数据集摘要 本数据集是一个包含接近35年&#xff08;1984-201…

【Zephyr 系列 11】使用 NVS 实现 BLE 参数持久化:掉电不丢配置,开机自动加载

🧠关键词:Zephyr、NVS、非易失存储、掉电保持、Flash、AT命令保存、配置管理 📌目标读者:希望在 BLE 模块中实现掉电不丢配置、支持产测参数注入与自动加载功能的开发者 📊文章长度:约 5200 字 🔍 为什么要使用 NVS? 在实际产品中,我们经常面临以下场景: 用户或…

解锁Java线程池:性能优化的关键

一、引言 在 Java 并发编程的世界里&#xff0c;线程池是一个至关重要的概念。简单来说&#xff0c;线程池就是一个可以复用线程的 “池子”&#xff0c;它维护着一组线程&#xff0c;这些线程可以被重复使用来执行多个任务&#xff0c;而不是为每个任务都创建一个新的线程。​…

一站式直播工具:助力内容创作者高效开启直播新时代

近年来&#xff0c;随着互联网技术的不断进步和短视频、直播行业的爆发式增长&#xff0c;越来越多的企业和个人投入到直播电商、互动娱乐、在线教育等场景。直播运营过程中&#xff0c;涉及到数据统计、弹幕互动、流程自动化、内容同步等诸多环节。如何提升运营效率、减少人工…

数论——同余问题全家桶3 __int128和同余方程组

数论——同余问题全家桶3 __int128和同余方程组 快速读写和__int128快速读写__int128 中国剩余定理和线性同余方程组中国剩余定理(CRT)中国剩余定理OJ示例模板题曹冲养猪 - 洛谷模板题猜数字 - 洛谷 扩展中国剩余定理扩展中国剩余定理OJ示例模板题扩展中国剩余定理&#xff08;…

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…

㊗️高考加油

以下是极为详细的高考注意事项清单&#xff0c;涵盖考前、考中、考后全流程&#xff0c;建议逐条核对&#xff1a; 一、考前准备 1. 证件与物品 必带清单&#xff1a; 准考证&#xff1a;打印2份&#xff08;1份备用&#xff09;&#xff0c;塑封或夹在透明文件袋中防皱湿。身…

学习路之PHP--webman安装及使用、webman/admin安装

学习路之PHP--webman安装及使用、webman/admin安装 一、安装webman二、运行三、安装webman/admin四、效果五、配置Nginx反向代理&#xff08;生产环境&#xff1a;可选&#xff09;六、win10运行问题集七、使用 一、安装webman 准备&#xff1a; PHP > 8.1 Composer > 2…

mamba架构和transformer区别

Mamba 架构和 Transformer 架构存在多方面的区别&#xff0c;具体如下&#xff1a; 计算复杂度1 Transformer&#xff1a;自注意力机制的计算量会随着上下文长度的增加呈平方级增长&#xff0c;例如上下文增加 32 倍时&#xff0c;计算量可能增长 1000 倍&#xff0c;在处理长序…

Python爬虫实战:研究mechanize库相关技术

1. 引言 随着互联网数据量的爆炸式增长,网络爬虫已成为数据采集和信息挖掘的重要工具。Python 作为一种功能强大且易于学习的编程语言,拥有丰富的爬虫相关库,如 Requests、BeautifulSoup、Scrapy 等。Mechanize 库作为其中的一员,特别擅长处理复杂的表单提交和会话管理,为…

如何使用索引和条件批量更改Series数据

视频演示 如何通过索引与布尔条件修改 pandas Series&#xff1f;实操演示来了 一、前言&#xff1a;掌握Series数据修改是数据处理的基础 在使用Python进行数据分析时&#xff0c;Pandas库的Series对象是最常用的结构之一。在上一个视频中我们已经学习了如何创建Series对象&a…

CentOS 7 如何安装llvm-project-10.0.0?

CentOS 7 如何安装llvm-project-10.0.0&#xff1f; 需要先升级gcc至7.5版本&#xff0c;详见CentOS 7如何编译安装升级gcc版本?一文 # 备份之前的yum .repo文件至 /tmp/repo_bak 目录 mkdir -p /tmp/repo_bak && cd /etc/yum.repo.d && /bin/mv ./*.repo …

6个月Python学习计划 Day 15 - 函数式编程、高阶函数、生成器/迭代器

第三周 Day 1 &#x1f3af; 今日目标 掌握 Python 中函数式编程的核心概念熟悉 map()、filter()、reduce() 等高阶函数结合 lambda 和 列表/字典 进行数据处理练习了解生成器与迭代器基础&#xff0c;初步掌握惰性计算概念 &#x1f9e0; 函数式编程基础 函数式编程是一种…

SpringCloud Gateway 集成 Sentinel 详解 及实现动态监听Nacos规则配置实时更新流控规则

目录 一、前言二、版本选择和适配 2.1、本文使用各组件版本2.2、官方推荐版本 三、部署sentinel-dashboard 3.1、下载 sentinel-dashboard jar包3.2、启动 sentinel-dashboard 四、Gateway 集成 Sentinel实现控制台配置流控规则测试 4.1、添加Gateway 集成 Sentinel 包4.2、添加…

Linux八股【1】-----虚拟内存

参考&#xff1a;小林coding 虚拟内存存在的目的&#xff1f; 为了能够同时运行多个进程同时进程之间互不干扰 虚拟地址通过MMU找到物理地址 物理内存怎么映射的&#xff1f; 物理内存的映射方法主要有两种&#xff0c;内存分段和内存分页 内存分段 把程序的不同区&#…