LeetCode第240题_搜索二维矩阵II

article/2025/8/11 7:32:42

LeetCode 第240题:搜索二维矩阵 II

题目描述

编写一个高效的算法来搜索 m × n 矩阵 matrix 中的一个目标值 target。该矩阵具有以下特性:

  • 每行的元素从左到右升序排列。
  • 每列的元素从上到下升序排列。

难度

中等

题目链接

点击在LeetCode中查看题目

示例

示例 1:

输入:matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 5
输出:true

示例 2:

输入:matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 20
输出:false

提示

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= m, n <= 300
  • -10^9 <= matrix[i][j] <= 10^9
  • 每行的所有元素从左到右升序排列
  • 每列的所有元素从上到下升序排列
  • -10^9 <= target <= 10^9

解题思路

这道题要求我们在一个特殊的二维矩阵中查找一个目标值。矩阵的特性是每行从左到右升序,每列从上到下升序。我们需要设计一个高效的算法来判断目标值是否存在。

有几种常见的解题思路:

方法一:暴力搜索

最简单的方法是遍历整个矩阵,逐个检查每个元素是否等于目标值。这种方法的时间复杂度是 O(m*n),其中 m 和 n 分别是矩阵的行数和列数。虽然这种方法简单直接,但没有充分利用矩阵的有序特性。

方法二:二分查找

由于每行和每列都是有序的,我们可以对每一行(或每一列)进行二分查找。这种方法的时间复杂度是 O(mlog(n))(或 O(nlog(m)))。这比暴力搜索要好,但仍然没有充分利用矩阵的双向有序特性。

方法三:从右上角(或左下角)开始搜索

我们可以从矩阵的右上角(或左下角)开始搜索,利用矩阵的双向有序特性进行高效查找:

  1. 初始位置在右上角(或左下角)。
  2. 如果当前元素等于目标值,找到并返回 true。
  3. 如果当前元素大于目标值,说明当前列的下方元素也都大于目标值,可以排除当前列,向左移动一列。
  4. 如果当前元素小于目标值,说明当前行的左侧元素也都小于目标值,可以排除当前行,向下移动一行。
  5. 如果搜索范围超出矩阵边界,则目标值不存在,返回 false。

这种方法的时间复杂度是 O(m+n),明显优于前两种方法。空间复杂度是 O(1),因为只使用了常数级别的额外空间。

我们将主要实现方法三,因为它是最优解。

代码实现

C# 实现

public class Solution {public bool SearchMatrix(int[][] matrix, int target) {// 从右上角开始搜索int m = matrix.Length;if (m == 0) return false;int n = matrix[0].Length;if (n == 0) return false;int row = 0;int col = n - 1;while (row < m && col >= 0) {if (matrix[row][col] == target) {return true;} else if (matrix[row][col] > target) {// 当前元素大于目标值,向左移动一列col--;} else {// 当前元素小于目标值,向下移动一行row++;}}return false;}
}

Python 实现

class Solution:def searchMatrix(self, matrix: list[list[int]], target: int) -> bool:# 从右上角开始搜索if not matrix or not matrix[0]:return Falsem, n = len(matrix), len(matrix[0])row, col = 0, n - 1while row < m and col >= 0:if matrix[row][col] == target:return Trueelif matrix[row][col] > target:# 当前元素大于目标值,向左移动一列col -= 1else:# 当前元素小于目标值,向下移动一行row += 1return False

C++ 实现

class Solution {
public:bool searchMatrix(vector<vector<int>>& matrix, int target) {// 从右上角开始搜索if (matrix.empty() || matrix[0].empty()) {return false;}int m = matrix.size();int n = matrix[0].size();int row = 0;int col = n - 1;while (row < m && col >= 0) {if (matrix[row][col] == target) {return true;} else if (matrix[row][col] > target) {// 当前元素大于目标值,向左移动一列col--;} else {// 当前元素小于目标值,向下移动一行row++;}}return false;}
};

性能分析

各语言实现的性能对比:

实现语言方法执行用时内存消耗说明
C#从右上角搜索140 ms54.9 MB线性时间复杂度,高效
Python从右上角搜索156 ms23.6 MB与C#性能接近
C++从右上角搜索80 ms14.9 MB最佳性能,内存占用最小

从性能对比来看,C++实现拥有最佳的性能和内存占用,这主要是由于其语言级别的优势。不过三种语言的实现都达到了O(m+n)的时间复杂度,相对于矩阵大小来说是高效的。

补充说明

代码亮点

  1. 使用矩阵特性(行列有序)选择最优的搜索起点,避免了不必要的搜索。
  2. 每一步都能排除一行或一列,使搜索范围快速缩小。
  3. 代码简洁明了,无需复杂的数据结构。

优化方向

  1. 对于非常大的矩阵,可以考虑先用二分查找确定可能的行或列范围,再应用本算法。
  2. 如果矩阵中有大量重复元素,可以考虑添加缓存来避免重复计算。

解题难点

  1. 理解矩阵的双向有序特性如何帮助我们高效搜索。
  2. 选择合适的搜索起点(右上角或左下角),其他起点如左上角或右下角都不适合。
  3. 处理矩阵为空或只有一个元素的边界情况。

常见错误

  1. 没有检查矩阵是否为空或尺寸是否为0。
  2. 从左上角或右下角开始搜索,这样无法确定下一步该向哪个方向移动。
  3. 搜索过程中索引越界。
  4. 在遍历过程中修改了矩阵元素。

相关题目

  • LeetCode 第74题:搜索二维矩阵 - 类似的二维矩阵搜索问题,但矩阵有更严格的有序条件。
  • LeetCode 第378题:有序矩阵中第K小的元素 - 同样使用矩阵的有序特性。
  • LeetCode 第1351题:统计有序矩阵中的负数 - 可以用类似的方法高效解决。
    cn/problems/kth-smallest-element-in-a-sorted-matrix/) - 同样使用矩阵的有序特性。
  • LeetCode 第1351题:统计有序矩阵中的负数 - 可以用类似的方法高效解决。
  • LeetCode 第1428题:至少有一个 1 的最左端列 - 利用二维矩阵的有序特性进行高效搜索。

http://www.hkcw.cn/article/oqGqIkSTyY.shtml

相关文章

开始通信之旅-----话题通信

1. 话题通信的流程 话题通信主要涉及到三个对象 管理者发布者订阅者 其主要流程如下图 详细解释一下&#xff1a;1.发布者向管理者发送发布话题等相关信息&#xff0c;在管理者处注册 2.订阅者向管理者发布订阅话题等相关信息&#xff0c;在管理者处注册 &#xff08;注意…

Ansible自动化运维工具全面指南:从安装到实战应用

目录 1 Ansible核心介绍 1.1 什么是Ansible&#xff1f; 1.2 Ansible核心特点解析 1.2.1 基于Python生态 1.2.2 无代理架构优势 1.2.3 幂等性实现原理 2 Ansible离线安装指南 2.1 内网环境安装准备 2.2 分步安装过程 2.2.1 安装依赖包 2.2.2 安装Ansible主包 2.2.3…

设计模式——模版方法设计模式(行为型)

摘要 模版方法设计模式是一种行为型设计模式&#xff0c;定义了算法的步骤顺序和整体结构&#xff0c;将某些步骤的具体实现延迟到子类中。它通过抽象类定义模板方法&#xff0c;子类实现抽象步骤&#xff0c;实现代码复用和算法流程控制。该模式适用于有固定流程但部分步骤可…

ACL基础配置

文章目录 基本ACL配置组网需求组网拓扑实验步骤测试结果配置文件 高级ACL配置组网需求组网拓扑实验步骤测试结果配置文件 基本ACL配置 组网需求 现组网结构如下&#xff0c;VPC充当服务器&#xff0c;PC3与PC4是两个不同的网段&#xff0c;实现拒绝192.168.1.0/24访问VPC 组…

Redis最佳实践——热点数据缓存详解

Redis在电商热点数据缓存中的最佳实践 一、热点数据定义与识别 1. 热点数据特征 高频访问&#xff08;QPS > 1000&#xff09;数据规模适中&#xff08;单条 < 10KB&#xff09;数据变化频率低&#xff08;更新间隔 > 5分钟&#xff09;业务关键性高&#xff08;直接…

Git初识Git安装

目录 1. Git初识 1.1 提出问题 1.2 如何解决--版本控制器 1.3 注意事项 2 Git安装 2.1 Centos 2.2 Ubuntu 2.3 Windows 1. Git初识 1.1 提出问题 不知道你工作或学习时&#xff0c;有没有遇到这样的情况&#xff1a;我们在编写各种文档时&#xff0c;为了防止文档丢失…

数据库原理 试卷

以下是某高校教学管理系统的毕业论文指导ER图&#xff0c;数据信息&#xff1a;一名教师指导多名学生&#xff0c;一名学生只能选择一名教师&#xff0c;试分析完成以下各题&#xff0c;如用SQL命令完成的&#xff0c;在SQL Server2008验证后把答案写在题目的下方。 图1 毕业论…

在线音乐平台测试报告

一、项目背景 1.1 测试目标 验证音乐播放器功能完整性&#xff0c;确保用户管理、音乐管理、播放控制、收藏功能等核心模块符合需求。 1.2 项目技术栈 后端&#xff1a;Spring Boot/Spring MVC 数据库&#xff1a;MySQL 前端&#xff1a;原生 HTML/CSS/AJAX 1.3 项目源码 …

基于GeoTools和OSM路网求解两条道路相交点-以长沙市为例

目录 前言 一、基础数据简介 1、QGIS数据展示 2、元数据介绍 二、GeoTools相交求解 1、加载路网数据 2、查找道路信息 3、计算相交点 4、集成调用及输出 三、总结 前言 今天是端午节也是六一儿童节&#xff0c;当端午节碰到儿童节&#xff0c;双节的碰撞。在这祝各位朋…

中国高分辨率高质量地面CO数据集(2013-2023)

时间分辨率&#xff1a;日空间分辨率&#xff1a;1km - 10km共享方式&#xff1a;开放获取数据大小&#xff1a;9.83 GB数据时间范围&#xff1a;2013-01-01 — 2023-12-31元数据更新时间&#xff1a;2024-08-19 数据集摘要 ChinaHighCO数据集是中国高分辨率高质量近地表空气污…

t018-高校宣讲会管理系统 【含源码!】

项目演示视频 摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装高校宣讲会管理系统软件来发挥其高效地信息处…

NLP学习路线图(十四):词袋模型(Bag of Words)

在自然语言处理&#xff08;NLP&#xff09;的广阔天地中&#xff0c;词袋模型&#xff08;Bag of Words, BoW&#xff09; 宛如一块历经岁月沉淀的基石。它虽非当今最耀眼的明星&#xff0c;却为整个领域奠定了至关重要的基础&#xff0c;深刻影响了我们让计算机“理解”文本的…

Windows系统时间怎么设置

打开设置窗口&#xff1a;右键单击任务栏上的时间和日期显示区域&#xff0c;选择 “调整日期 / 时间”。 调整时区&#xff1a;在 “日期和时间” 设置窗口中&#xff0c;单击 “更改时区”&#xff0c;从下拉列表中选择正确的时区&#xff0c;若希望计算机自动调整为夏令时&a…

ssm 学习笔记day03

环境搭建 spring配置数据库 1.在pom.xml安装相应的依赖 2.在properties里面配置数据库的相关信息&#xff0c;需要强调的一点是&#xff0c;一定不要在properties里面添加任何空格&#xff0c;否则就会像我一样搞了两小时&#xff0c;数据一直报错&#xff0c;然后发现是空格的…

Python6.1打卡(day33)

DAY 33 MLP神经网络的训练 知识点回顾&#xff1a; 1.PyTorch和cuda的安装 2.查看显卡信息的命令行命令&#xff08;cmd中使用&#xff09; 3.cuda的检查 4.简单神经网络的流程 1.数据预处理&#xff08;归一化、转换成张量&#xff09; 2.模型的定义 …

python打卡day42

Grad-CAM与Hook函数 知识点回顾 回调函数lambda函数hook函数的模块钩子和张量钩子Grad-CAM的示例 在深度学习中&#xff0c;我们经常需要查看或修改模型中间层的输出或梯度&#xff0c;但标准的前向传播和反向传播过程通常是一个黑盒&#xff0c;很难直接访问中间层的信息。PyT…

[总结]前端性能指标分析、性能监控与分析、Lighthouse性能评分分析

前端性能分析大全 前端性能优化 LightHouse性能评分 性能指标监控分析 浏览器加载资源的全过程性能指标分析 性能指标 在实现性能监控前&#xff0c;先了解Web Vitals涉及的常见的性能指标 Web Vitals 是由 Google 推出的网页用户体验衡量指标体系&#xff0c;旨在帮助开发者量…

Linux 驱动之设备树

Linux 驱动之设备树 参考视频地址 【北京迅为】嵌入式学习之Linux驱动&#xff08;第七期_设备树_全新升级&#xff09;_基于RK3568_哔哩哔哩_bilibili 本章总领 1.设备树基本知识 什么是设备树&#xff1f; ​ Linux之父Linus Torvalds在2011年3月17日的ARM Linux邮件列表…

Unity Mono与IL2CPP比较

Unity提供了两种主要的脚本后端(Scripting Backend)选项&#xff1a;Mono和IL2CPP。它们在性能、平台支持和功能特性上有显著差异。 Edit>Project Settings>Player>Other Settings Mono后端 特点&#xff1a; 基于开源的Mono项目(.NET运行时实现) 使用即时编译(JIT…

配置Ollama环境变量,实现远程访问

在安装 Ollama 时配置环境变量 OLLAMA_HOST0.0.0.0:11434的主要目的是允许 Ollama 服务被局域网或远程设备访问&#xff0c;而不仅仅是本地主机&#xff08;localhost&#xff09;。 以下是详细原因&#xff1a; 1. Ollama默认行为的限制 默认情况下&#xff0c;Ollama 的 API…