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

【LeetCode】74. 搜索二维矩阵

74. 搜索二维矩阵(中等)

在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

方法一:二分查找

思路

  • 总体思路

    由于二维矩阵固定列的「从上到下」或者固定行的「从左到右」都是升序
    因此我们可以使用两次二分来定位到目标位置。

    1. 第一次二分: 从第 0 列中的「所有行」开始找,找到合适的行 row, 即找到最后一个满足 matrix[x][0] <= target 的行号;
    2. 第二次二分:从 row 中「所有列」开始找,找到合适的列 col ,即找到最后一个满足 matrix[row][y] <= target 的列号。
  • 二分代码解释

    这里用到了二分查找的高级模板,left = mid,用于查找数组中当前索引及其直接左邻居索引的元素或条件。

    注意,while 语句的条件是 left < right

    此外,mid 值计算需要 +1 ,如果不加 1 会出现死循环(比如l = 2, r = 3 的时候,如果不加 1,在满足 l = mid 的情况下,会一直死循环)。

    int binarySearch(vector<int>& nums, int target){if(nums.size() == 0)return -1;int left = 0, right = nums.size();while(left < right){// Prevent (left + right) overflowint mid = left + (right - left) / 2;if(nums[mid] == target){ return mid; }else if(nums[mid] <= target) { left = mid; }else { right = mid + 1; }}// Post-processing:// End Condition: left == rightif(left != nums.size() && nums[right] == target) return right;return -1;}
    

代码

class Solution {
public:bool searchMatrix(vector<vector<int>>& matrix, int target) {int m = matrix.size(), n = matrix[0].size();int row, col;int left = 0, right = m-1;// 第一次二分找到最后一个不大于目标值的元素的所在行while(left < right){int mid = left + (right - left + 1) / 2;if(matrix[mid][0] <= target)  left = mid;else right = mid - 1;}row = right;// 可以先判断,减少时间复杂度if(matrix[row][0] == target) return true;if(matrix[row][0] > target) return false;// 第二次二分找到所在列left = 0, right = n-1;while(left<right){int mid = left + (right - left + 1) / 2;if(matrix[row][mid] <= target)   left = mid;else right = mid - 1;}col = right;return matrix[row][col] == target;}
};

方法二:一次二分

思路

  • 如果将数组按行逐元素连接起来,那么数组将形成一个单调递增序列,我们可以使用一次二分在该 “一维数组” 中查找,如果找到target ,返回 true;否则返回false。
  • 对于一次二分,因为只有找到 target 和 没找到 target 两种情况,所以只需要普通的模板。

代码

class Solution {
public:bool searchMatrix(vector<vector<int>>& matrix, int target) {int m = matrix.size(), n = matrix[0].size();int left = 0, right = m * n - 1;// 一次二分while(left <= right){int mid = left + (right - left) / 2;if(matrix[mid/n][mid%n] == target) return true;else if(matrix[mid/n][mid%n] < target) left = mid + 1;else right = mid - 1;             }return false;}
};

方法三:抽象二叉搜索树

思路

  • 我们可以将二维矩阵抽象成「以右上角为根的 BST」:
    在这里插入图片描述

  • 那么我们可以从根(右上角)开始搜索,如果当前的节点不等于目标值,可以按照树的搜索顺序进行:

    • 当前节点「大于」目标值,搜索当前节点的「左子树」,也就是当前矩阵位置的「左方格子」,即 y–
    • 当前节点「小于」目标值,搜索当前节点的「右子树」,也就是当前矩阵位置的「下方格子」,即 x++

代码

class Solution {
public:bool searchMatrix(vector<vector<int>>& matrix, int target) {int m = matrix.size(), n = matrix[0].size();// 当前的坐标值,从右上角开始查找int x = 0, y = n-1;while(check(x, y, m, n) && matrix[x][y] != target){// 如果matrix[x][y] > target 说明需要向左查找if(matrix[x][y] > target)   y--;// 如果matrix[x][y] > target 说明需要向下查找else if(matrix[x][y] < target)  x++;}return check(x, y, m, n) && matrix[x][y] == target;}// 边界情况判断bool check(int x, int y, int m, int n){return x>=0 && x<m && y>=0 && y<n;}
};

参考资料

  1. 二分查找的三种模板(C++版)

  2. 【宫水三叶】一题双解:「二分」&「抽象 BST」解法

相关文章:

【LeetCode】74. 搜索二维矩阵

74. 搜索二维矩阵&#xff08;中等&#xff09; 方法一&#xff1a;二分查找 思路 总体思路 由于二维矩阵固定列的「从上到下」或者固定行的「从左到右」都是升序的 因此我们可以使用两次二分来定位到目标位置。 第一次二分&#xff1a; 从第 0 列中的「所有行」开始找&#x…...

Nginx rewrite

一.location 大致可以分为三类&#xff1a; 精准匹配&#xff1a;location / {…}一般匹配&#xff1a;location / {…}正则匹配&#xff1a;location ~ / {…} 1.location 常用的匹配规则&#xff1a; &#xff1a;进行普通字符精确匹配&#xff0c;也就是完全匹配。^~ &am…...

【数据分享】1929-2022年全球站点的逐日降水量(Shp\Excel\12000个站点)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、湿度等指标&#xff0c;说到常用的降水数据&#xff0c;最详细的降水数据是具体到气象监测站点的降水数据&#xff01; 有关气象指标的监测站点数据&#xff0c;之前我们分享过1929-2022年全…...

【论文阅读】(2013)Exact algorithms for the bin packing problem with fragile objects

文章目录 一、摘要二、介绍三、之前在这个问题上的工作四、易碎物品背包问题的求解4.1 ILP模型4.2 基于KP01的方法4.3 动态规划 五、二元分支方案5.1 分支方案1&#xff08;基于决策变量的分支&#xff09;5.2 分支方案2&#xff08;基于yj和xji的分支&#xff09;5.3 将L2嵌入…...

K8S YAML 部署XXLJOB 集群

apiVersion: apps/v1 kind: Deployment metadata: labels: app: xxl-job-admin name: xxl-job-admin namespace: ccetest #根据情况修改namespace spec: replicas: 3 #根据情况修改副本数 selector: matchLabels: app: xxl-job-admin strat…...

Linux防火墙学习笔记3

iptables链的概念&#xff1a; 当客户端访问服务器端的Web服务的时候&#xff0c;客户端发送请求报文到网卡&#xff0c;而TCP/IP协议栈是属于内核的一部分。客户端的请求报文会通过内核的TCP协议传输到用户空间的Web服务&#xff0c;而客户端报文的目的地址为Web服务器所监听的…...

数仓用户行为数据分析

分层优点&#xff1a;复杂的东西可以简单化、解耦&#xff08;屏蔽层作用&#xff09;、提高复用、方便管理 SA 贴源 数据组织结构与源系统保持一致 shm 历史层 针对不同特征的数据做不同算法&#xff0c;目的都是为了得到一份完整的数据 PDM 明细层 做最细粒度的数据明细…...

RK3288 Android5.1添加WiFiBT模块AP6212

CPU&#xff1a;RK3288 系统&#xff1a;Android 5.1 注&#xff1a;RK3288系统&#xff0c;目前 Android 5.0 Kernel 3.10 SDK 支持 Braodcom,Realtek 等 WiFi BT 模块 各个 WiFi BT 模块已经做到动态兼容&#xff0c;Android 上层不再需要像以前一样进 行特定宏的配置 此…...

使用 YApi 管理 API 文档,测试, mock

随着互联网的发展&#xff0c;API变的至关重要。根据统计&#xff0c;目前市面上有上千万的开发者&#xff0c;互联网项目超过10亿&#xff0c;保守统计涉及的 API 数量大约有 100 亿。这么大基数的API&#xff0c;只要解决某些共有的痛点&#xff0c;将会是非常有意义的事情。…...

chatgpt生成【2023高考作文】北京卷二 - 亮相

舞台上&#xff0c;戏曲演员有登场亮相的瞬间。生活中也有许多亮相时刻&#xff1a;国旗下的讲话&#xff0c;研学成果的汇报&#xff0c;新产品的发布……每一次亮相&#xff0c;都受到众人关注&#xff1b;每一次亮相&#xff0c;也会有一段故事。 请以“亮相”为题目&#x…...

实验四、shell编程

一、实验目的 1.了解shell的特点和主要种类。 2.掌握 shel1 脚本的建立和执行方式。 3.掌握bash的基本语法。 4.学会编写shell 脚本。 二、实验内容 shell 脚本的建立和执行。历史命令和别名定义。shell变量和位置参数、环境变量。bash的特殊字符。一般控制结构。算术运算及…...

【代码随想录】刷题Day51

1.最佳买卖股票时机含冷冻期 309. 最佳买卖股票时机含冷冻期 1.dp数组的含义&#xff1a;dp[i][0]为第i天卖出股票的最大价值&#xff1b;dp[i][1]为第i天持有股票的最大价值 2.dp数组的条件&#xff1a;由于有冷冻期&#xff0c;所以dp数组的条件就变了。第i天卖出股票的最大…...

centos7下svnserve方式部署subversion/SVN服务端(实操)

一般来说&#xff0c;subversion服务器可以用两种方式架设&#xff1a; 一种是基于svnserve&#xff0c;svnserve作为服务端&#xff1b; 一种是基于Apache&#xff0c;用apache作为服务端。 这里采用第一种方式部署。 执行如下命令&#xff0c;安装SVN。 yum install sub…...

一款红队批量脆弱点搜集工具

功能 指纹识别:调用“三米前有香蕉皮“前辈工具&#xff0c;他的工具比finger好用 寻找资产中404&#xff0c;403&#xff0c;以及网页中存在的其他薄弱点&#xff0c;以及需要特定路径访问的资产 后续会把nuclei加进来 目前只有windows可以用 使用 第一次使用脚本请运行p…...

Docker 基本管理

一、Docker 概述 Docker是一个开源的应用容器引擎&#xff0c;基于go语言开发并遵守了apache2.0协议开源。 Docker是在Linux容器里运行应用的开源工具&#xff0c;是一种轻量级的“虚拟机”。 Docker的容器技术可以在一台主机上轻松为任何应用创建一个轻量级的、可移植的、自…...

Debezium系列之:把多张表的数据分发到同一个Kafka Topic,同一张表的数据始终进入Topic相同分区

Debezium系列之:把多张表的数据分发到同一个Kafka Topic,同一张表的数据始终进入Topic相同分区 一、需求背景二、实现思路三、核心参数和参数详解四、创建相关表五、提交Debezium Connector六、插入数据七、消费Kafka Topic八、总结和延展一、需求背景 debezium采集数据库的多…...

雪崩 - 如何重试 - sla和重试风暴的双保证

父文章 异常导致级联雪崩的例子 - 不应该有立即重试._个人渣记录仅为自己搜索用的博客-CSDN博客 一个系统处于稳态临界点 如果立即重试3次, 会导致流量瞬间增大, 哪怕后来系统10s内自愈了, 这个时候, 流量本质上增加了3倍. 如果rpc框架不是fastFail ( 超过 调用方失败timeout上…...

[网鼎杯 2018]Fakebook1

拿到题目后是一个博客的界面&#xff0c;这里可以登录和注册 点入登录界面&#xff0c;猜测可能是sql注入 试了很多次&#xff0c;都不是&#xff0c;也没有回显报错&#xff0c;所以把目光放到了注册上面 注册的其他行数据&#xff0c;差不多都可以乱填&#xff0c;只有一个bl…...

Oracle-第一章-多表查询和其他

4多表关联查询 4.1表的别名 ①在多表关联查询时&#xff0c;如果多个表之间存在同名的列&#xff0c;则必须用表名限定列的引用如dept.deptno,emp.deptno ②为使语句简洁&#xff0c;使用表别名&#xff0c;表别名在from子句中定义如 emp e ③表别名一经定义&#xff0c;在整…...

Office Visio 2016安装

哈喽&#xff0c;大家好。今天一起学习的是Visio 2016的安装&#xff0c;这是一个绘制流程图的软件&#xff0c;用有效的绘图表达信息&#xff0c;比任何文字都更加形象和直观。Office Visio 是office软件系列中负责绘制流程图和示意图的软件&#xff0c;便于IT和商务人员就复杂…...

GPT从入门到精通之 GPT 模型入门及原理介绍

GPT 模型入门及原理介绍 如果你关心人工智能&#xff0c;并关注最新的自然语言处理技术&#xff0c;那么你可能听说过 GPT 模型。GPT&#xff08;Generative Pre-trained Transformer&#xff09;是 OpenAI [1] 研究团队开发的一种基于 Transformer 架构的模型&#xff0c;能够…...

USB数据线上的“疙瘩”

在不少键盘、鼠标或是游戏外设的数据线末端我们都能见到一小段金属圆环。虽然这算得上是习以为常的一个设计&#xff0c;但如果说到其具体作用的话很多人一下子还真回答不上来。反正笔者在这里先可以告诉大家&#xff0c;这货肯定不是简简单单的配重块或是装饰品&#xff0c;要…...

公司新来了个00后测开,上来一顿操作给我秀麻了.....

开年公司新来了个同事&#xff0c;听说大学是学的广告专业&#xff0c;因为喜欢IT行业就找了个培训班&#xff0c;后来在一家小公司实习半年&#xff0c;现在跳槽来我们公司。来了之后把现有项目的性能优化了一遍&#xff0c;服务器缩减一半&#xff0c;性能反而提升4倍!给公司…...

深度学习架构-Tensorflow

深度学习基本概念 人工智能是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。人工智能的目的 就是让计算机能够像人一样思考。 强人工智能&#xff1a;就是要使机器学习人的理解、学习和执行任务的能力。 弱人工智能&#xff1a;指用…...

SpringBoot 使用validator进行参数校验(实例操作+注意事项+自定义参数校验)

一、实例操作 ①、引入依赖 <dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId><version>6.0.4.Final</version></dependency> ②、创建实体类 package com.springboot.entity;im…...

字节测开岗面试记:二面被血虐,幸好还是拿到了Offer.....

在互联网做了几年之后&#xff0c;去大厂“镀镀金”是大部分人的首选。大厂不仅待遇高、福利好&#xff0c;更重要的是&#xff0c;它是对你专业能力的背书&#xff0c;大厂工作背景多少会给你的简历增加几分竞争力。 但说实话&#xff0c;想进大厂还真没那么容易。最近面试字…...

只会标准答案,是不可救药的愚蠢

听说今天高考&#xff0c;谨以此文作为高考寄语。 前段时间网上看到一个金句&#xff0c;非常值得分享&#xff0c;“最难沟通的&#xff0c;不是那些头脑空空的人&#xff0c;而是满脑子只有标准答案的人”。 前两天直播我放了一首何勇的老歌&#xff0c;当时年轻的时候&#…...

RocketMQ broker启动失败

版本&#xff1a;4.9.3 现象&#xff1a;NameServer启动没问题&#xff0c;Broker无法启动。 查看日志&#xff0c;没有broker方面的报错&#xff0c;应该是整个服务都没起来。 于是开始网上搜索解决方案&#xff1a; 方案1&#xff1a; 删除store文件夹。 删除之后问题依…...

浅谈useMemo函数

什么是 useMemo&#xff1f; useMemo 是 React 中的一个 Hook&#xff0c;它可以用来缓存计算结果&#xff0c;并在后续的渲染中重复利用这些计算结果。useMemo 接收两个参数&#xff1a;一个函数和一个依赖数组。当依赖数组中的任何一个值发生变化时&#xff0c;useMemo 会重…...

【Python】Python系列教程-- Python3 推导式(十九)

文章目录 前言列表推导式字典推导式集合推导式元组推导式&#xff08;生成器表达式&#xff09; 前言 往期回顾&#xff1a; Python系列教程–Python3介绍&#xff08;一&#xff09;Python系列教程–Python3 环境搭建&#xff08;二&#xff09;Python系列教程–Python3 VSc…...

网站首页置顶是怎么做/免费网站排名优化在线

阅读本文大概需要 10 分钟。Docker是一个不断发展的系统&#xff0c;开发人员积极改进使用和性能。所以命令总是在变化。docker一些老的命令经常被弃用&#xff0c;并被新的或更有效的命令取代。您可以使用帮助选项检查Docker安装上的最新可用命令&#xff1a;$ docker --help…...

ps如何做音乐网站/北京百度竞价

问题&#xff1a; 刚刚解决了前端访问的问题&#xff0c;前端是能调用了&#xff0c;但是我的swagger界面无法显示了。 原因&#xff1a; 由于配置了CORS&#xff0c;swagger的内置接口被拦截器拦下了。 解决方案&#xff1a; 在你的 CORS的配置文件 里&#xff0c;加上如下…...

怎么做动态网站/网络推广官网首页

https://www.cnblogs.com/alimjan/p/7798295.html https://blog.csdn.net/qq_43847542/article/details/93412505 https://blog.csdn.net/qq_33696345/article/details/79989880 设计说明书以及功能演化 1&#xff1a; 单线程实现网络聊天室----》多线程实现----》线程池实现…...

wordpress自定义文章添加标签/公司官网制作多少钱

使用yum安装epel yum源&#xff0c;并安装nginx1、安装epel-release2、yum repolist3、查看 epel repo4、安装 nginx5、启动 nginx 服务6、web 进行访问1、安装epel-release [rootNeo_Tang ~]# yum install epel-release -y Loaded plugins: fastestmirror Loading mirror spe…...

网站建设哪家/在哪里找专业推广团队

欢迎关注”生信修炼手册”!框架是为了解决特定的业务场景而开发的一套高质量代码&#xff0c;通过框架避免了重复造轮子的低效模式&#xff0c;可以更加专注于具体业务相关的代码。在python中&#xff0c;scrapy就是一个主流的爬虫框架&#xff0c;可以通过如下方式进行安装pip…...

网站管理助手4.0教程/搜索引擎优化培训中心

最近遇到&#xff0c;如果用户频繁点击ajax请求&#xff0c;有两个问题&#xff1a; 1&#xff0c;如果连续点击了5个ajax请求&#xff0c;前4个其实是无效的&#xff0c;趁早结束节省资源。 2&#xff0c;更严重的问题是&#xff1a;最后一个发送的请求&#xff0c;响应未必…...