【Go】 力扣 - 剑指 Offer 第五天 - 二维数组中的查找

news2025/4/18 10:44:07

[Go] 力扣 - 剑指 Offer 第五天 - 二维数组中的查找

  • 题目来源
  • 题目描述
  • 示例
  • 题目分析
  • 算法
    • 暴力法
      • 代码实现
      • 复杂度分析
    • 二分法
      • 代码实现
      • 复杂度分析
    • 模拟 BST 标记查找法
      • 代码实现
      • 复杂度分析
  • 结尾

耐心和持久胜过激烈和狂热。

题目来源

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/er-wei-shu-zu-zhong-de-cha-zhao-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题目描述

在一个 n * m 的二维数组中,每一行都按照从左到右 非递减 的顺序排序,每一列都按照从上到下 非递减 的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

示例

现有矩阵 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。

给定 target = 20,返回 false。

题目分析

  • 根据题意,判断 target 是否存在于二维数组中,简单粗暴的方法就是暴力法,两层循环遍历,然后依判断每个元素是否与 target 相等,但是这样做效率很差,最坏情况下,需要 O(NM) 的时间复杂度,N 为二维数组的行数,M 为二维数组的列数。
  • 由题可知,每一行或每一列的元素按照递增的的顺序排序,根据元素的顺序特点,我们可以使用二分法进行算法优化,先遍历行或者列,再对列或者行进行二分查找,提高查询效率。
  • 逆时针 45° 翻转矩阵,如下图所示,观察元素由上而下的特点,类似一颗 二叉搜索树 (BST),3 为根节点,左分支 23 小,右分支 63 大,根据这个特点,可以再次优化算法,提高查询效率。
    在这里插入图片描述

算法

暴力法

通过两次循环遍历,依次判断二维数组中的元素是否等于 target,相等则返回 true,否则返回 false

代码实现

func findNumberIn2DArray(matrix [][]int, target int) bool {
	for i := 0; i < len(matrix); i++ {
		for j := 0; j < len(matrix[i]); j++ {
			if matrix[i][j] == target {
				return true
			}
		}
	}
	return false
}

复杂度分析

时间复杂度:O(NM),其中 N 为矩阵行数,M 为矩阵列数。
空间复杂度:O(1),没有使用额外的内存空间。

二分法

  • 先循环遍历
  • 初始化左边界 left 和右边界 right,对 进行二分查找
    • 计算中间值 mid
    • 判断 mid 是否等于 target ,等于则返回 true
    • mid 大于 target 时,左边界 left 向右移动,移动到 mid + 1 的位置
    • mid 小于 target 时,右边界 right 向左移动,移动到 mid - 1 的位置
    • 循环结束之后,没有找到与 target 相等的元素,返回 false

代码实现

func findNumberIn2DArray(matrix [][]int, target int) bool {
    for _, nums := range matrix {
        left, right := 0, len(nums) - 1
        for left <= right {
            mid := (left + right) / 2
            if target == nums[mid] {
                return true
            }
            if nums[mid] > target {
                right = mid - 1 
            } else {
                left = mid + 1
            }
        }
    }
    return false
}

复杂度分析

时间复杂度:O(NlogM),其中 N 为矩阵行数,M 为矩阵列数,此算法最多循环 N * logM 次。
空间复杂度:O(1),没有使用额外的内存空间。

模拟 BST 标记查找法

matrix = [[1, 2,3],[4, 5,6],[7, 8,9]]target = 4

  • 对二维数组进行判空,空则返回 false
  • 初始化 i = 0, j = len(matrix[0]) - 1 = 2,将标记点设置为 6,开始遍历,标记点与 target 进行比较
    • matrix[i][j] == target 时,找到目标值,返回 true
    • if matrix[i][j] > target 时,j--,将标记点左下移动
    • matrix[i][j] < target 时,i++,将标记点右下移动
  • 遍历结束后,未找到目标值,返回 false
    在这里插入图片描述

代码实现

func findNumberIn2DArray(matrix [][]int, target int) bool {
    if len(matrix) == 0 {
        return false
    }
	for i, j := 0, len(matrix[0])-1; i <= len(matrix) - 1 && j >= 0; {
		if matrix[i][j] == target {
			return true
		}
		if matrix[i][j] > target {
			j--
		} else {
			i++
		}
	}
	return false
}

复杂度分析

时间复杂度:O(N + M),其中 N 为矩阵行数,M 为矩阵列数,此算法最多循环 N + M 次。
空间复杂度:O(1),没有使用额外的内存空间。

结尾

如果本文对你有帮助,欢迎点赞收藏加关注,如果本文有错误的地方,欢迎指出!

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

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

相关文章

TestStand-从LabVIEW创建TestStand数据类型的簇

文章目录从LabVIEW创建TestStand数据类型的簇从LabVIEW创建TestStand数据类型的簇 TestStand提供数字、字符串、布尔值和对象引用内置数据类型。 TestStand还提供了几种标准的命名数据类型&#xff0c;包括路径、错误、LabVIEW模拟波形等。可以通过创建容器数据类型来保存任何…

【第四部分 | JavaScript 基础】1:JS概述、变量及输入输出

目录 | 概述 | JS的书写位置 | 输入输出 | 变量 命名规范 基本使用 通过输入语句prompt把信息赋值给变量 | 数据类型 JS数据类型的特别 简单数据类型 简介 简单数据类型 Number 简单数据类型 String 简单数据类型 Boolean、Undefined、Null 获取类型 类型转换 | …

巴菲特斥资290亿抄底,台积电跌成“白菜价”?

11月14日&#xff0c;巴菲特旗下伯克希尔向美国证券交易委员会&#xff08;SEC&#xff09;提交了13F季度报告。报告显示&#xff0c;三季度伯克希尔斥资41亿美元&#xff08;约290亿人民币&#xff09;大幅买入台积电。 报告发出后&#xff0c;第二天台积电美股涨超6%&#x…

多旋翼无人机组合导航系统-多源信息融合算法(Matlab代码实现)

&#x1f352;&#x1f352;&#x1f352;欢迎关注&#x1f308;&#x1f308;&#x1f308; &#x1f4dd;个人主页&#xff1a;我爱Matlab &#x1f44d;点赞➕评论➕收藏 养成习惯&#xff08;一键三连&#xff09;&#x1f33b;&#x1f33b;&#x1f33b; &#x1f34c;希…

GLAD:利用全息图实现加密和解密

概述 全息图能够通过两束相干光相干叠加获得。用其中一束光照射生成的全息图就可以得到另一束相干光&#xff0c;这样全息图就可以用作加密/解密的装置了。 系统描述 在本例中一个复杂的随机图样作为参考光源&#xff0c;用来恢复全息图样对应的物光源。加密过程中&am…

单目标应用:人工兔优化算法(Artificial Rabbits Optimization ,ARO)求解旅行商问题TSP(提供MATLAB代码)

一、算法简介 人工兔优化算法&#xff08;Artificial Rabbits Optimization &#xff0c;ARO&#xff09;由Liying Wang等人于2022年提出&#xff0c;该算法模拟了兔子的生存策略&#xff0c;包括绕道觅食和随机躲藏&#xff0c;并通过能量收缩在两种策略之间转换。绕道觅食策…

显示订单列表【项目 商城】

显示订单列表【项目 商城】前言显示订单列表1 持久层1.1 规划SQL语句1.2 实现接口与抽象方法1.3 配置SQL映射测试2 业务层2.1 规划异常2.2 编写接口与抽象方法2.3 实现抽象方法测试3 控制器3.1 处理异常3.2 设计请求3.3 处理请求测试4 前端页面测试前言 写作于 2022-10-14 17:…

【MySQL】安装与配置(内附安装包+未将对象引用设置到对象的实例的错误解决方法)

目录 一、数据库分类 &#xff08;1&#xff09;关系型数据库&#xff08;RDBMS&#xff09; &#xff08;2&#xff09;非关系型数据库 二、MySQL服务器安装 三、安装包文件分享 一、数据库分类 数据库大体可以分为关系型数据库和非关系型数据库 &#xff08;1&#xff0…

U盘复制错误0x80071ac3如何解决?

U盘是一款移动存储设备&#xff0c;但是在使用中也会遇到一些错误问题&#xff0c;比如文件复制、粘贴或移动时提示0x80071ac3错误代码要如何解决呢&#xff1f;下面就和小编一起来看看解决办法吧。 方法一&#xff1a; 1、有些用户是使用U盘时出现的问题&#xff0c;先按下快捷…

记宝塔使用webhook自动化同步gitee代码

1、服务器ssh密钥 1.1、输入命令查看服务器是否存在密钥&#xff1a; cd ~/.sshls id_xxx.pub的是公钥、id_xxx的是私钥 如果没有&#xff0c;就要先生成一下&#xff0c;生成ssh密钥参考https://gitee.com/help/articles/4181#article-header0 1.2、复制ssh公钥到码云公钥…

【Hack The Box】linux练习-- Blocky

HTB 学习笔记 【Hack The Box】linux练习-- Blocky &#x1f525;系列专栏&#xff1a;Hack The Box &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2022年11月17日&#x1f334; &#x1f3…

UE4 回合游戏项目 22- 添加第二个玩家

在上一节&#xff08;UE4 回合游戏项目 21- 添加多种类型的敌人&#xff09;基础上新添加一个玩家角色 效果&#xff1a; 步骤&#xff1a; 1.打开进阶游戏资源&#xff0c;解压“回合迁移_第七节&#xff08;只是新人物包&#xff09;” 2.解压后双击打开工程 3.选中“ziyuan…

如何通过快解析实现外网远程访问JupyterNotebook

什么是Jupyter Notebook&#xff1f;官网介绍&#xff1a;Jupyter Notebook是基于网页的用于交互计算的应用程序。其可被应用于全过程计算&#xff1a;开发、文档编写、运行代码和展示结果。简单地说&#xff0c;Jupyter Notebook是以网页的形式打开&#xff0c;可以在网页页面…

Spring Boot——yml和properties详解

文章目录1. 配置文件作用2. 配置文件的格式和分类2.1 规则&#xff08;tips&#xff09;2.2 为配置文件安装提示插件3. properties 配置文件说明3.1 properties 基本语法3.2 关于 properties 中文乱码的问题处理&#xff1a;4. 读取 properties 配置文件4.1 读取单个配置文件5.…

Spring @DateTimeFormat日期格式化时注解浅析分享

文章目录总结写前面为什么用怎么用场景一场景二场景三场景四场景五方式一方式二总结写前面 关于它 DateTimeFormat&#xff1a; 可以接收解析前端传入字符时间数据&#xff1b;不能格式化接收的字符时间类型数据&#xff0c;需要的转换格式得配置&#xff1b;入参格式必须与后…

罗丹明PEG羟基,RB-PEG-OH,Rhodamine-PEG-OH

产品名称&#xff1a;罗丹明PEG羟基 英文名称&#xff1a;RB-PEG-OH&#xff0c;Rhodamine-PEG-OH&#xff0c;Rhodamine PEG hydroxyl&#xff0c;RB-PEG-OH CAS&#xff1a;1030-000-8 结构式&#xff1a; 罗丹明吸收波长570 nm,发射波长约595 nm。罗丹明B可追踪粉红色和红…

Git——Git介绍及安装步骤

目录 一、Git概述&#xff1a;分布式版本控制工具 1.1 版本控制介绍 1.1.3为什么需要版本控制&#xff1f; 1.2 版本控制工具 1.2.1 集中式版本控制工具 1.2.2 分布式版本控制工具 1.3 工作机制和代码托管中心&#xff08;远程库&#xff09; 二、Git安装 2.1 官网下载安装…

用物理光学建模演示点阵投影仪的工作原理

摘要 点阵投影仪是启用Apple Face ID的关键组件。 该系统通常由发光单元阵列&#xff0c;透镜和分束光栅组成。 透镜系统与光栅一起投射&#xff0c;并复制阵列光源图案。 在此示例中&#xff0c;我们构建了这种点阵投影仪系统并演示了其工作原理。为进行系统分析&#xff0c;我…

[Java]枚举类

文章目录&#x1f34a; 枚举类理解&#x1f34a; 自定义枚举类&#x1f34a; 使用 enum 关键字定义枚举类&#x1f34a; Enum类的常用方法&#x1f96d; toString()&#x1f96d; Enum.valueOf(Class enumClass, String name)&#x1f96d; valueOf(String name)&#x1f96d; …

艾美捷Bio-Helix BluPAD双LED蓝白光照胶台丨舒适、方便

艾美捷Bio-Helix BluPAD双LED蓝白光照胶台&#xff08;切胶仪&#xff0c;透射仪&#xff09;&#xff0c;适用于各种生命科学研究领域&#xff0c;用于观察和分析核酸和蛋白质。鉴于其对凝胶切割、数据成像和归档等观察后应用的最优化和人性化设计&#xff0c;希望为研究人员提…