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

在二维矩阵/数组中查找元素 Leetcode74, Leetcode240

这一类题型中二维数组的元素取值有序变化,因此可以用二分查找法。我们一起来看一下。

一、Leetcode 74

Leetcode 74. 搜索二维矩阵 这道题要在一个二维矩阵中查找元素。该二维矩阵有如下特点:

  • 每行元素 从左到右 按非递减顺序排列。
  • 每行的第一个元素 > 前一行的最后一个元素。

也就是说,这种二维数组的元素逐行、逐列递增变化,如下图所示,沿箭头方向元素值递增:

在这里插入图片描述

方法一:做两次二分查找。
  • 先在第一列中查找值为 target 的元素所在行。
  • 再在这一行中查找值为 target 的元素所在列。

在这两步中,难点在于第一步确定 target 所在行。以图中的示例矩阵为例,要寻找 3,如何定位到 3 所在行呢?在第一列的元素中,3 所在行的第一列元素 1 是小于 3 的元素中最接近 3 的元素,这就是第一步的思路:在第一列元素中查找小于等于 target、且最接近 target 的元素。这里可以用 Leetcode 69 所使用的方法(欢迎阅读文章:二分查找法搜寻元素 Leetcode35, Leetcode69,其中详细介绍了这类问题的两种解决方法,本文采用了其中一种方法。)

相应的 Python 代码和注释为:

class Solution:def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:# 第一步:查找元素所在行low, high = 0, len(matrix) - 1while low <= high:mid = low + (high - low) // 2# 注意:这里是在第 1 列查找,# mid元素索引为 matrix[mid][0]。if matrix[mid][0] == target:return Trueelif matrix[mid][0] > target:high = mid - 1else:low = mid + 1# 确定元素所在行(row)row = high# 第二步:查找元素所在列low, high = 0, len(matrix[0]) - 1while low <= high:mid = low + (high - low) // 2# 注意:这里是在第 row 行查找,# mid元素索引为 matrix[row][mid]。if matrix[row][mid] == target:return Trueelif matrix[row][mid] > target:high = mid - 1else:low = mid + 1return False         
方法二:把二维矩阵看作一个一维数组处理。

因为矩阵的元素是按升序排列,我们在处理时可以把它想象成连续的一维序列,就像上图示例矩阵中的元素,在脑子里把它“拼接”成一个连续的一维数组,[1,3,5,7,10,11,16,20,23,30,34,60],在这个升序数组里查找元素很容易。

但是,这个一维数组索引只是我们为了解决问题做的设想,实际中矩阵元素是以二维数组形式存储的,因此每次索引元素值时还需要一个操作:把(设想的)一维数组索引换算回(实际的)二维数组索引。

相应的 Python 代码和注释为:

class Solution:def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:# 求 mxn 矩阵的维度大小m = len(matrix)n = len(matrix[0])# 按“一维”有序数组处理length = m*nlow, high = 0, length - 1while low <= high:mid = low + (high - low) // 2# 关键:索引时要把(设想的)一维数组索引换算回(实际的)二维数组索引。mid_row = mid // nmid_col = mid % nmid_val = matrix[mid_row][mid_col] if mid_val == target:return Trueelif mid_val > target:high = mid - 1else:low = mid + 1return False           

方法二实现起来比方法一更简洁,但是我在 Leetcode 运行代码时发现方法二比方法一的耗时大。

二、Leetcode 240

Leetcode 240. 搜索二维矩阵 II 这道题也是在二维矩阵中查找元素。不同的是,这里的二维矩阵有如下特点:

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

下图所示为一个示例矩阵:

在这里插入图片描述

这道题的巧妙之处在于中点 mid 的选择

根据给定矩阵的升序排列特点,一个元素位于第 i 行、第 j 列,则该元素所在行第 0 ~ ( j - 1 ) 列的元素都比它小;该元素所在列第 ( i + 1 ) ~ ( m - 1 ) 行的元素都比它大。具体来说,以上图的示例矩阵为例,如绿色箭头标识所示,以圆圈中的元素 8 为中点,[ 2, 5, 8, 9, 14, 23 ] 这些元素就构成了一个升序排列的数组。也就是说,以第 i 行、第 j 列的元素为直角,其所在行和列元素构成的 倒 “L” 形状序列 是一个有序数组,而在直角的这个元素就是数组的中点。在这个数组中可以用二分查找:比较中点的元素与目标值 target 的大小决定下一步的寻找范围。如果该元素大于 target,就往左移一列:j - 1。如果该元素小于 target,就往下移一行:i + 1。

应该从哪里开始呢?选择右上角的元素(第 0 行,(n-1) 列)做为起始 mid 元素,逐步推进到左下角元素。时间复杂度是 O(m+n)。这一点您可以试一下,如果要找的元素位于左下角,正好要走 m+ n 步。

相应的 Python 代码为:

class Solution:def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:m, n = len(matrix), len(matrix[0])i, j = 0, n - 1while i < m and j >= 0:if matrix[i][j] == target:return Trueelif matrix[i][j] > target:j -= 1else:i += 1return False             

本文对您有帮助的话,请点赞支持一下吧,谢谢!

关注我 宁萌Julie,互相学习,多多交流呀!

参考

1.Leetcode 74 方法二思路:Don’t treat it as a 2D matrix, just treat it as a sorted list - Search a 2D Matrix - LeetCode

2.Leetcode 240 思路:My concise O(m+n) Java solution - Search a 2D Matrix II - LeetCode

相关文章:

在二维矩阵/数组中查找元素 Leetcode74, Leetcode240

这一类题型中二维数组的元素取值有序变化&#xff0c;因此可以用二分查找法。我们一起来看一下。 一、Leetcode 74 Leetcode 74. 搜索二维矩阵 这道题要在一个二维矩阵中查找元素。该二维矩阵有如下特点&#xff1a; 每行元素 从左到右 按非递减顺序排列。每行的第一个元素 …...

MS35657步进电机驱动器可兼容DRV8824

MS35657 是一款双通道 DMOS 全桥驱动器&#xff0c;可以驱动一个步进电机或者两个直流电机。可兼容DRV8824&#xff08;功能基本一致&#xff0c;管脚不兼容&#xff09;。每个全桥的驱动电流在 24V 电源下可以工作到 1.4A。MS35657 集成了固定关断时间的 PWM 电流校正器&#…...

SQL语句性能优化

1、查询 SQL 尽量不要使用 select *,而是 select 具体字段 反例子: select * from sys_user; 正例子: select id,name from sys_user; 理由如下: 只取需要的字段,节省资源、减少网络开销。select * 进行查询时,很可能就不会使用到覆盖索引了,就会造成回表查询。…...

线性代数之 伪逆矩阵

目录 一、伪逆矩阵 ◼ A的伪逆矩阵与SVD ◼ 用Python代码计算A的伪逆矩阵 ◼ 笔算A的伪逆矩阵 一、伪逆矩阵 ◼ A的伪逆矩阵与SVD 逆矩阵并不总是存在&#xff0c;即使是方阵。然而&#xff0c;对于非正方形矩阵&#xff0c;存在一个伪逆矩阵&#xff0c;也叫摩尔-彭罗斯…...

【3D图像分割】基于Pytorch的VNet 3D 图像分割5(改写数据流篇)

在这篇文章&#xff1a;【3D 图像分割】基于 Pytorch 的 VNet 3D 图像分割2&#xff08;基础数据流篇&#xff09; 的最后&#xff0c;我们提到了&#xff1a; 在采用vent模型进行3d数据的分割训练任务中&#xff0c;输入大小是16*96*96&#xff0c;这个的裁剪是放到Dataset类…...

【漏洞复现】Apache_Shiro_1.2.4_反序列化漏洞(CVE-2016-4437)

感谢互联网提供分享知识与智慧&#xff0c;在法治的社会里&#xff0c;请遵守有关法律法规 文章目录 1.1、漏洞描述1.2、漏洞等级1.3、影响版本1.4、漏洞复现1、基础环境2、漏洞分析3、漏洞验证 说明内容漏洞编号CVE-2016-4437漏洞名称Apache_Shiro_1.2.4_反序列化漏洞漏洞评级…...

Mac连接linux的办法(自带终端和iterm2)

1. 使用Mac自带终端Terminal 1.1 点击右上角的聚焦搜索&#xff0c;再输入终端 1.2 查找linux系统的ip地址 在虚拟机里输入如下命令&#xff0c;找到蓝色区域的就是ip地址 ip addr 如果没有显示ip地址&#xff0c;可以重新安装一下虚拟机&#xff0c;之后确保以太网的连接是打…...

js调整table表格上下相邻元素顺序

有时候我们会遇到要通过箭头控制table表格上下顺序的需求,如下: 点击向下就将该元素下移一位,下面的一位元素就移上来,点击向上就将该元素上移一位,上面的一位元素就移下来,也就是相邻元素互换位置顺序: <el-table :data="targetTable" border style=&quo…...

基于ruoyi框架项目-部署到服务器上

基于ruoyi框架项目-部署到服务器上 文章目录 基于ruoyi框架项目-部署到服务器上1.前端vue编译&#xff0c;后的dist下内容打包&#xff08;前后端分离版本需要&#xff09;2.后端打包成jar包&#xff08;如果是thymeleaf仅需打包jar&#xff09;3.上传到服务器目录下4. docker部…...

Docker 持久化存储和数据共享_Volume

有些容器会自动产生一些数据&#xff0c;为了不让数据随着 container 的消失而消失&#xff0c;保证数据的安全性。例如&#xff1a;数据库容器&#xff0c;数据表的表会产生一些数据&#xff0c;如果我把 container 给删除&#xff0c;数据就丢失。为了保证数据不丢失&#xf…...

万宾科技智能井盖监测仪器助力建设数字化城市

市政公共设施建设在近几年来发展迅速&#xff0c;市政设备的更新换代&#xff0c;资产管理等也成为其中的重要一项。在市政设施建设过程中&#xff0c;井盖也是不可忽视的&#xff0c;一方面&#xff0c;根据传统的管理井盖模式来讲&#xff0c;缺乏有效的远程监控管理方法和手…...

第十一章《搞懂算法:聚类是怎么回事》笔记

聚类是机器学习中一种重要的无监督算法&#xff0c;可以将数据点归结为一系列的特定组合。归为一类的数据点具有相同的特性&#xff0c;而不同类别的数据点则具有各不相同的属性。 11.1 聚类算法介绍 人们将物理或抽象对象的集合分成由类似 的对象组成的多个类的过程被称为聚…...

给定n个点或一个凸边形,求其最小外接矩形,可视化

这里写目录标题 原理代码 原理 求n个点的最小外接矩形问题可以等价为先求这n个点的凸包&#xff0c;再求这个凸包的最小外接矩形。 其中求凸包可以使用Graham-Scan算法 需要注意的是&#xff0c; 因为Graham-Scan算法要求我们从先找到凸包上的一个点&#xff0c;所以我们可以先…...

蓝桥杯每日一题2023.11.6

取位数 - 蓝桥云课 (lanqiao.cn) 题目描述 题目分析 由题意我们知道len中为现阶段长度&#xff0c;如果其与k相等也就是找到了正确的位数&#xff0c;否则就调用递归来进行搜索&#xff0c;每次搜索一位数。 #include <stdio.h> // 求x用10进制表示时的数位长度 int …...

V-REP和Python的联合仿真

机器人仿真软件 各类免费的的机器人仿真软件优缺点汇总_robot 仿真 软件收费么_dyannacon的博客-CSDN博客 课程地址 https://class.guyuehome.com/p/t_pc/course_pc_detail/column/p_605af87be4b007b4183a42e7 课程资料 guyueclass: 古月学院课程代码 旋转变换 旋转的左乘与…...

WPF布局控件之DockPanel布局

前言&#xff1a;博主文章仅用于学习、研究和交流目的&#xff0c;不足和错误之处在所难免&#xff0c;希望大家能够批评指出&#xff0c;博主核实后马上更改。 概述&#xff1a; DockPanel 位置子控件基于子 Dock 属性&#xff0c;你有 4 个选项停靠&#xff0c;左 (默认) &…...

【实战Flask API项目指南】之二 Flask基础知识

实战Flask API项目指南之 Flask基础知识 本系列文章将带你深入探索实战Flask API项目指南&#xff0c;通过跟随小菜的学习之旅&#xff0c;你将逐步掌握Flask 在实际项目中的应用。让我们一起踏上这个精彩的学习之旅吧&#xff01; 前言 当小菜踏入Flask后端开发的世界&…...

Linux 编译链接那些事儿(02)C++链接库std::__cxx11::basic_string和std::__1::basic_string链接问题总结

1 问题背景说明 在自己的项目源码中引用libeasysqlite.so时编译成功&#xff0c;但运行时遇到问题直接报错&#xff0c;找不到符号 symbol&#xff1a;_ZN3sql5FieldC1ENSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEENS_10field_typeEi。 2 问题描述和解…...

按键精灵中的UI界面操作

1. 按键精灵中UI界面常用的控件 1. 文字框 界面1: {标签页1:{文字框:{名称:"文字框1",显示内容:"显示内容",文字大小:0,高度:0,宽度:0,注释:"文字大小、高度、宽度是可选属性&#xff0c;如需使用默认值&#xff0c;可保持值为0或直接删除此属性&qu…...

dpdk 程序如何配置网卡收发包队列描述符配置?

问题描述 dpdk 程序在配置网卡队列时会涉及收发包队列描述符数量配置问题&#xff0c;收发包描述符的数量看似是一个简单的配置&#xff0c;却对转发性能有着一定的影响。实际业务程序中&#xff0c;收发包描述符大小配置一般参考 dpdk 内部示例程序配置进行&#xff0c;经验之…...

Topit:macOS窗口置顶神器,让多任务处理效率翻倍

Topit&#xff1a;macOS窗口置顶神器&#xff0c;让多任务处理效率翻倍 【免费下载链接】Topit Pin any window to the top of your screen / 在Mac上将你的任何窗口强制置顶 项目地址: https://gitcode.com/gh_mirrors/to/Topit 你是否经常在macOS上同时处理多个任务时…...

C语言双端队列完整实现:一行代码吃透头尾操作,算法效率拉满

一、为什么C语言实现双端队列&#xff0c;是数据结构的必学天花板&#xff1f;在C语言数据结构里&#xff0c;队列、栈都是基础中的基础&#xff0c;但真正能把灵活度、效率、内存管理三者揉到一起的&#xff0c;还得是双端队列&#xff08;deque&#xff09;。普通队列只能一头…...

用数字逻辑门复刻柏林钟:从二进制编码到硬件实现

1. 项目概述&#xff1a;用数字电路复刻“柏林钟”作为一个在柏林长大的孩子&#xff0c;我从小就对库达姆大街上的那座“柏林钟”着迷。它不像传统时钟那样用指针或数字告诉你时间&#xff0c;而是通过几排不同颜色的发光方块&#xff0c;以一种近乎艺术的方式呈现时间。这种独…...

PCB虚焊/走线断裂/焊盘脱落工程师易漏判

PCB 故障中&#xff0c;30% 并非元件损坏&#xff0c;而是 PCB 本身的隐性故障—— 虚焊、走线断裂、焊盘脱落、过孔开路。这类故障外观隐蔽、时好时坏、排查难度大&#xff0c;很多工程师反复更换元件仍无法解决&#xff0c;最终误判为 “板报废”。​一、PCB 隐性故障核心成因…...

基于ESP32的智能电池充电器设计:多化学体系支持与模块化架构

1. 项目概述&#xff1a;打造一台全能的“电池医生”手头攒了一堆不同化学体系的电池&#xff0c;从航模用的4S锂聚合物电池&#xff0c;到应急灯里的12V铅酸电池&#xff0c;再到各种工具里的镍氢、锂离子电池&#xff0c;每次充电都得翻出好几个不同的充电器&#xff0c;桌面…...

腾讯 Marvis 初级使用教程——从安装到上手

腾讯最新系统级AI助手Marvis&#xff08;2026年5月20日发布&#xff09;&#xff0c;官网 https://marvis.qq.com&#xff0c;主打“一句话操作电脑”、跨端协同、GUI Agent执行。虽然是个【小龙虾】&#xff0c;但上手其实不难。这篇就简单写写 Marvis 的安装和基础使用&#…...

随机森林算法在儿童出行方式预测中的实战应用与优化

1. 项目概述&#xff1a;用随机森林预测孩子怎么上学做城市交通规划或者做家长接送方案的时候&#xff0c;你肯定想过一个问题&#xff1a;孩子们到底是怎么上学的&#xff1f;是走路、骑车、坐公交还是家长开车送&#xff1f;这个问题看似简单&#xff0c;背后却牵扯到城市规划…...

INT8量化下TVA注意力对齐精度保障方案

重磅预告&#xff1a;本专栏将独家连载系列丛书《智能体视觉技术与应用》部分精华内容&#xff0c;该书是世界首套系统阐述“因式智能体”视觉理论与实践的专著&#xff0c;特邀美国 TypeOne 公司首席科学家、斯坦福大学博士 Bohan 担任技术顾问。Bohan先生师从美国三院院士、“…...

Keil µVision反汇编窗口内容导出方案与调试技巧

1. 问题背景与需求解析在嵌入式开发过程中&#xff0c;调试环节往往占据大量时间。Keil Vision作为业界广泛使用的集成开发环境(IDE)&#xff0c;其调试器功能强大但某些细节功能仍有提升空间。最近我在使用C251架构开发汽车电子控制单元时&#xff0c;就遇到了一个看似简单却影…...

抖音内容批量下载实战:从零开始构建个人视频资料库

抖音内容批量下载实战&#xff1a;从零开始构建个人视频资料库 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support.…...