搜索二维矩阵 II(LeetCode 240)

1.问题描述

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

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

示例:

在这里插入图片描述

输入: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

2.难度等级

Medium。

3.热门指数

★★★★☆

4.解题思路

方法一:直接查找

我们直接遍历整个矩,判断 target 是否出现即可。

时间复杂度: O(mn)。

空间复杂度: O(1)。

下面以 Golang 为例给出实现。

func searchMatrix(matrix [][]int, target int) bool {for _, row := range matrix {for _, v := range row {if v == target {return true}}}return false
}

方法二:二分查找

由于矩阵中每一行的元素都是升序排列的,因此我们可以对每一行都二分查找,判断 targett 是否在该行中。

时间复杂度: O(mlogn)。对一行使用二分查找的时间复杂度为 O(log⁡n),最多需要进行 m 次二分查找。

空间复杂度: O(1)。

下面以 Golang 为例给出实现。

func searchMatrix(matrix [][]int, target int) bool {for _, row := range matrix {i := sort.SearchInts(row, target)if i < len(row) && row[i] == target {return true}}return false
}

方法三:Z 字形查找

上面的两个方法效率并不高效,实际上还有线性时间复杂度的解法。

矩阵有两个特性:

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

那么我们可以比较明显得感知到这两个特性就会是我们解开这个题的关键所在了。

们以示例一的矩阵作为例子,如果我们以某一个边角作为出发点,那么我们会得出如下结论:

【左上角】从左到右,升序排列;从上到下,升序排列;
【右上角】从右到左,降序排列;从上到下,升序排列;
【左下角】从左到右,升序排列;从下到上,降序排列;
【右上角】从右到左,降序排列;从下到上,降序排列;

具体情况,请见下图所示:

在这里插入图片描述
通过上面我们的分析,可以发现左下角和右上角这两个出发点才是我们解题的关键,因为这两个点在水平方向移动和在垂直方向移动分别是递增或者递减的;那么我们就可以执行如下逻辑:

【如果当前格子的值 小于 target】那么就向递增方向移动;
【如果当前格子的值 大于 target】那么就向递减方向移动;
【如果当前格子的值 等于 target】那么返回 true;
【如果移动 越界 并且 不等于 target】那么返回 false;

下面以左下角为例,从左下角开始搜索 5。当然,从右上角搜索也是可以的。
在这里插入图片描述
时间复杂度: O(m+n)。最坏情况下是从右上角搜索到左下角,遍历了 m+n 个元素。

空间复杂度: O(1)。

下面以 Golang 为例给出实现。

func searchMatrix(matrix [][]int, target int) bool {m, n := len(matrix), len(matrix[0])// 从左下角开始搜索。x, y := m-1, 0for x >= 0 && y < n {if matrix[x][y] == target {return true}if matrix[x][y] > target {x--} else {y++}}return false
}

参考文献

240. 搜索二维矩阵II - LeetCode

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

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

相关文章

快速、准确地检测和分类病毒序列分析工具 ViralCC的介绍和详细使用方法,fudai shiyong ijaoben

介绍 viralcc是一个基因组病毒分析工具&#xff0c;可以用于快速、准确地检测和分类病毒序列。 github&#xff1a;dyxstat/ViralCC: ViralCC: leveraging metagenomic proximity-ligation to retrieve complete viral genomes (github.com) Instruction of reproducing resul…

微众区块链观察节点的架构和原理 | 科普时间

践行区块链公共精神&#xff0c;实现更好的公众开放与监督&#xff01;2023年12月&#xff0c;微众区块链观察节点正式面向公众开放接入功能。从开放日起&#xff0c;陆续有多个观察节点在各地运行&#xff0c;同步区块链数据&#xff0c;运行区块链浏览器观察检视数据&#xf…

flutter项目用vscode打包apk包,完美运行到手机上

1.创建密钥库 执行以下命令: keytool -genkey -v -keystore F:/key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias key 生成 2,048 位RSA密钥对和自签名证书 (SHA256withRSA) (有效期为 10,000 天) 2.填写密钥内容 执行以上命令后会提示一次输入密钥库密码、确认…

【ES6语法学习】解构赋值

文章目录 引言一、什么是解构赋值1.1什么是解构赋值1.2 数组的解构赋值1.2.1 基本用法1.2.2 默认值1.2.3 剩余参数 1.3 对象的解构赋值1.3.1 基本用法1.3.2 默认值1.3.2 剩余参数 1.4 字符串的解构赋值1.5 函数参数的解构赋值 二、解构赋值的优势和应用场景2.1 代码简化和可读性…

【React系列】JSX核心语法和原理

本文来自#React系列教程&#xff1a;https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzg5MDAzNzkwNA&actiongetalbum&album_id1566025152667107329) 一. ES6 的 class 虽然目前React开发模式中更加流行hooks&#xff0c;但是依然有很多的项目依然是使用类组件&#x…

es索引数据过滤查询

1.我们往kibana插入数据,来进行查询 POST /t1/_doc/ {"name":"cat","age":"18","address":"BJ","job":"dev" } POST /t1/_doc/ {"name":"dog","age":"1…

改善 GitHub Pages 阅读体验:Quick Docs

一个不到 10MB 的小工具&#xff0c;来提供本地、快速的文档访问&#xff0c;来改善开发过程中&#xff0c;阅读在线文档体验糟糕的问题。 以及&#xff0c;介绍如何快速制作一个利于分发使用的&#xff0c;离线文档工具包。 写在前面 即使现在 AI 辅助编码和 Chat Bot 类的…

【git使用】了解三种git commit合并的使用场景(rebase、merge、cherry-pick)

参考 【Git学习笔记】逃不掉的merge和rebase-腾讯云开发者社区-腾讯云git merge 和 git rebase - 知乎git cherry-pick 教程 - 阮一峰的网络日志 简单理解各种合并的方法 线性合并&#xff0c;使用 rebase —— feature 分支开发&#xff0c;提交前拉取 master 最新改动进行…

初识HTTP协议

Web服务器可以接收浏览器的请求&#xff0c;并将服务器中的web项目资源响应给浏览器&#xff0c;浏览器与服务器之间进行网络通信遵循HTTP协议。 一、什么是HTTP协议 超文本传输协议&#xff08;HTTP&#xff0c;HyperText Transfer Protocol&#xff09;(浏览器---->web服务…

微信小程序:flex常用布局

在我们平时微信小程序开发过程中为了页面能达到设计小伙伴的预期&#xff0c;追求还原度&#xff0c;那我们肯定会使用很多常用的布局方式&#xff0c;那我们今天就介绍一下微信小程序中常用的一些flex布局 1、常用flex布局 /** 水平垂直居中 **/ .flex-center {display: fle…

vue3+vant4 移动端软键盘弹出 收起导致项目样式布局错乱解决方案,亲测有效!!

问题描述 最近在做vue3 H5的移动端项目 我用的是vue3vant4&#xff0c;然后在使用过程中发现 小米14手机在点击密码输入框软键盘弹出 时会导致项目布局整体向上移动 导致页面布局错乱。 原因分析&#xff1a; 在移动端软键盘弹出收起时&#xff0c;导致项目样式布局错乱的原因…

基于STM32的ESP8266 WiFi模块数据采集与显示

基于STM32的ESP8266 WiFi模块数据采集与显示是一种常见的嵌入式系统应用&#xff0c;通常用于远程数据监测和控制。在这种应用中&#xff0c;STM32作为主控制器负责采集周围环境的数据&#xff0c;通过ESP8266 WiFi模块将数据发送到远程服务器&#xff0c;并在远程服务器上进行…

03-微服务-Ribbon负载均衡

Ribbon负载均衡 1.1.负载均衡原理 SpringCloud底层其实是利用了一个名为Ribbon的组件&#xff0c;来实现负载均衡功能的。 那么我们发出的请求明明是http://userservice/user/1&#xff0c;怎么变成了http://localhost:8081的呢&#xff1f; 1.2.源码跟踪 为什么我们只输入…

小梅哥Xilinx FPGA学习笔记20——无源蜂鸣器驱动设计与验证(音乐发生器设计)

目录 一&#xff1a;章节导读 二&#xff1a;无源蜂鸣器驱动原理 三&#xff1a;PWM 发生器模块设计 3.1 PWM 发生器模块框图 3.2 PWM 发生器模块接口功能描述 3.3 PWM波生成设计文件代码 3.4 测试仿真文件 3.5 测试仿真结果 3.6 板级调试与验证之顶层文件设计 四&am…

Python:界面开发,wx入门篇

以下内容为本人的学习笔记&#xff0c;如需要转载&#xff0c;请声明原文链接 微信公众号「ENG八戒」https://mp.weixin.qq.com/s/3Yb_YAKiMte_f5HanetXiA 本文大概 3617 个字&#xff0c;阅读需花 10 分钟 内容不多&#xff0c;但也花了一些精力 如要交流&#xff0c;欢迎评…

@Scheduled定时任务现状与改进

项目场景&#xff1a; 定时任务现状&#xff1a;每个项目都会有一些配置信息&#xff0c;这些信息我们是都放在一个配置服务中&#xff0c;这个服务会定时从配置表中加载所有配置存入本地JVM内存&#xff0c;以供调用方获取&#xff08;调用方集成了配置服务的SDK&#xff0c;…

elasticsearch的查询方式和数据库事务隔离级别的思考

项目中用到了 elasticsearch&#xff0c;发现有几种查询方式不太一样&#xff0c;思考了一下&#xff0c;总结如下 普通分页 等同于关系数据库的分页查询&#xff0c;例如 mysql 的 limit&#xff0c;如下 sql select * from test limit 100000,10 这种查询方式有一个问题&a…

系列十一、(一)Sentinel简介

一、Sentinel简介 1.1、官网 【英文文档】 https://github.com/alibaba/Sentinel/wiki【中文文档】 https://github.com/alibaba/Sentinel/wiki/%E4%B8%BB%E9%A1%B5 1.2、概述 1.3、功能

网络路由跟踪工具

随着企业网络需求的增长&#xff0c;组织发现监控和管理其网络基础设施变得越来越困难。网络管理员正在转向其他工具和资源&#xff0c;这些工具和资源可以使他们的工作更轻松一些&#xff0c;尤其是在故障排除方面。 目前&#xff0c;网络管理员主要使用简单、免费提供的实用…

在win10上cuda12+tensorrt8.6+vs2019环境下编译paddle2.6生成python包与c++推理库

paddle infer官方目前没有发布基于cuda12的c库&#xff0c;为此参考https://www.paddlepaddle.org.cn/inference/user_guides/source_compile.html实现cuda12的编译安装&#xff0c;不料博主才边缘好自己的paddle2.6&#xff0c;paddle官方已经发布了cuda12.0的paddle2.6框架。…