力扣最热一百题——搜索二维矩阵

目录

题目链接:240. 搜索二维矩阵 II - 力扣(LeetCode)

题目描述

解法一:暴力不解释

Java写法:

运行时间

C++写法:

运行时间

时间复杂度以及空间复杂度

 

解法二:利用自带的大小关系进行Z型走位

Java写法:

运行时间

C++写法

运行时间

时间复杂度以及空间复杂度

总结


题目链接:240. 搜索二维矩阵 II - 力扣(LeetCode)

注:下述题目描述和示例均来自力扣

题目描述

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

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

示例 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 <= n, m <= 300
  • -10^9 <= matrix[i][j] <= 10^9
  • 每行的所有元素从左到右升序排列
  • 每列的所有元素从上到下升序排列
  • -10^9 <= target <= 10^9


解法一:暴力不解释

  1. 初始化矩阵维度
    • 首先,通过matrix.length获取矩阵的行数(即y轴的长度,记作lenY)。
    • 然后,通过matrix[0].length获取矩阵的列数(即x轴的长度,记作lenX)。这里假设矩阵至少有一行,因此matrix[0]是有效的。
  2. 遍历矩阵
    • 使用两层嵌套的for循环遍历矩阵的每一个元素。外层循环遍历行(y轴),内层循环遍历列(x轴)。
    • 在遍历过程中,通过matrix[y][x]访问当前遍历到的元素,并将其与目标值target进行比较。
  3. 查找目标值
    • 如果在某个位置(y, x)上,当前元素matrix[y][x]等于目标值target,则表明找到了目标值,函数立即返回true
  4. 未找到目标值
    • 如果遍历完整个矩阵后都没有找到目标值,则函数返回false,表示目标值不在矩阵中。

Java写法:

class Solution {public boolean searchMatrix(int[][] matrix, int target) {// 获取y轴的长度int lenY = matrix.length;// 获取x轴的长度int lenX = matrix[0].length;// 判断数组非空if(lenY == 0 || lenX == 0){return false;}// 遍历这个二维数组for(int y = 0; y < lenY; y++){for(int x = 0; x < lenX; x++ ){// 如果找到了就返回trueif(target == matrix[y][x]){return true;}}}// 上面都没找到就返回falsereturn false;}
}
运行时间

C++写法:

class Solution {
public:bool searchMatrix(vector<vector<int>>& matrix, int target) {// 检查矩阵是否为空  if (matrix.empty() || matrix[0].empty()) {  return false;  }  // 获取y轴的长度(行数)  int lenY = matrix.size();  // 获取x轴的长度(列数),这里假设矩阵至少有一行  int lenX = matrix[0].size();  // 遍历这个二维数组  for (int y = 0; y < lenY; y++) {  for (int x = 0; x < lenX; x++) {  // 如果找到了就返回true  if (target == matrix[y][x]) {  return true;  }  }  }  // 上面都没找到就返回false  return false;  }  
};
运行时间

时间复杂度以及空间复杂度

 


解法二:利用自带的大小关系进行Z型走位

  1. 初始位置选择:由于矩阵的行和列都是有序的,从矩阵的右上角或左下角开始搜索都是可以的。这里选择从右上角开始(x = lenX - 1, y = 0),因为这样可以同时利用行和列的排序特性。

  2. 搜索逻辑

    • 如果当前元素matrix[y][x]等于目标值target,则直接返回true,因为找到了目标。
    • 如果当前元素小于目标值target,则由于当前行是从左到右递增的,我们可以确定目标值不可能在当前行的左侧(即更小的数),因此将y(行索引)增加,向下移动到下一行继续搜索。
    • 如果当前元素大于目标值target,则由于当前列是从上到下递增的,我们可以确定目标值不可能在当前列的下方(即更大的数),因此将x(列索引)减少,向左移动到前一列继续搜索。
  3. 循环终止条件:当x小于0或y大于等于lenY时,循环终止。这是因为x代表列索引,其有效范围是[0, lenX-1];而y代表行索引,其有效范围是[0, lenY-1]。如果x变为负数或y超出范围,说明已经搜索了矩阵的所有可能位置,但都没有找到目标值。

  4. 返回结果:如果在循环过程中找到了目标值,则返回true;如果循环结束后仍未找到目标值,则返回false

        这种搜索策略非常的有效,因为它利用了矩阵的行和列排序特性,通过每次比较后只排除一行或一列的可能性,从而减少了搜索空间。

Java写法:

class Solution {public boolean searchMatrix(int[][] matrix, int target) {// 由于数组是有序的,我们可以利用这个特性// 获取x,y轴方向上的长度int lenX = matrix[0].length;int lenY = matrix.length;// 从右上角开始寻找int x = lenX - 1;int y = 0;// 寻找逻辑while(x >= 0 && y < lenY){// 发现目标返回trueif(matrix[y][x] == target){return true;}// 由于我们是从右上角开始寻找的// 它的左边的数比他小,他下边的数比他大// 所以这里如果比target小,就往下找大的数if(matrix[y][x] < target){y++;}else{// 相反,这里比target大,就往左找小的数x--;}}// 如果最后还是没找到就返回falsereturn false;}
}

运行时间

C++写法

class Solution {
public:bool searchMatrix(vector<vector<int>>& matrix, int target) {// 获取x,y轴方向上的长度  int lenX = matrix[0].size();  int lenY = matrix.size();  // 从右上角开始寻找  int x = lenX - 1;  int y = 0;  // 寻找逻辑  while (x >= 0 && y < lenY) {  // 发现目标返回true  if (matrix[y][x] == target) {  return true;  }  // 由于我们是从右上角开始寻找的  // 它的左边的数比他小,他下边的数比他大  // 所以这里如果比target小,就往下找大的数  if (matrix[y][x] < target) {  y++;  } else {  // 相反,这里比target大,就往左找小的数  x--;  }  }  // 如果最后还是没找到就返回false  return false;  }  
};

运行时间

时间复杂度以及空间复杂度


总结

        总结来说就是暴力梭哈一切,冷静思考获得新生

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

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

相关文章

电商ISV 电商SaaS 是什么

Independent Software Vendors的英文缩写&#xff0c;意为“独立软件开发商” 软件即服务(SaaS) 指一种基于云技术的软件交付模式 订阅收费 这些公司叫做ISV软件供应商&#xff0c;通过SaaS服务交付收费 为什么会有电商ISV 从商家角度划分&#xff1a;有独立品牌商家、大商…

叉车限速器外接LED屏,监督厂区安全,让速度慢下来!

叉车限速器外接LED屏&#xff0c;可实时显示当前叉车行驶中的速度&#xff0c;单/双面电子显示屏供用户选择&#xff0c;方便企业人员监控司机当前行驶速度&#xff0c;当速度超过指定值时&#xff0c;叉车速度报警系统发出声光警示&#xff0c;提醒行人、司机&#xff0c;超速…

最新适用:关于夫妻共同债务的裁判规则+司法观点

✦ 重点条文 ✦ 《民法典》第一千零六十四条 夫妻双方共同签名或者夫妻一方事后追认等共同意思表示所负的债务&#xff0c;以及夫妻一方在婚姻关系存续期间以个人名义为家庭日常生活需要所负的债务&#xff0c;属于夫妻共同债务。 夫妻一方在婚姻关系存续期间以个人名义超…

新手入门:小程序架构快速上手

目录 新建项目和配置 项目基本结构 新建小程序页面 修改项目首页 全局配置 窗口 tabBar 页面配置 小程序基本语法 wxml 数据绑定 条件渲染 列表渲染 wxss wxss 对比 css rpx import 全局样式和局部样式 js wxs 数据请求 get和post请求 小程序和跨域 小程…

特征工程与交叉验证在机器学习中的应用

数据入口&#xff1a;学生考试表现影响因素数据集 - Heywhale.com 本数据集提供了关于影响学生考试成绩的多种因素的全面概述。数据集包含了有关学习习惯、出勤率、家长参与、资源获取等方面的信息。 数据说明 字段名说明Hours_Studied每周学习的小时数Attendance出勤率&…

30个GPT提示词天花板,一小时从大纲到终稿

PROMPT 1 中文&#xff1a;构建研究背景与意义&#xff0c;阐述研究问题的紧迫性和重要性。 English: Establish the research background and significance, elucidating the urgency and importance of the research question. 中文&#xff1a;设计研究目的与目标&#xff…

深入解析:HTTP 和 HTTPS 的区别

网络安全问题正变得日益重要&#xff0c;而 HTTP 与 HTTPS 对用户数据的保护十分关键。本文将深入探讨这两种协议的特点、工作原理&#xff0c;以及保证数据安全的 HTTPS 为何变得至关重要。 认识 HTTP 与 HTTPS HTTP 的工作原理 HTTP&#xff0c;全称超文本传输协议&#xf…

go 安装依赖超时

一、配置代理 go env -w GO111MODULEon go env -w GOPROXYhttps://goproxy.io,direct go get github.com/unidoc/unioffice

对象关系映射ORM

目录 ORM【重要】 1、 什么是ORM 2、 实体类 3、 ORM改造登录案例 ORM【重要】 1、 什么是ORM 目前使用JDBC完成了CRUD,但是现在是进行CRUD,增删改方法要设计很多参数,查询的方法需要设计集合才能返回. 在实际开发中,我们需要将零散的数据封装到对象处理. ORM (Object Rela…

十九、石英晶体振荡电路

石英晶体振荡电路 1、石英晶体的特点、等效电路、特性曲线; 2、石英晶体振动器的特点&#xff0c; 3、石英晶体振动器的振荡频率

软考(中级-软件设计师)计算机系统篇(0921)

六、计算机系统组成&#xff08;五大部件&#xff09; &#xff08;冯.诺依曼) 冯.诺依曼计算机的特点&#xff1a; 计算机有五大部件组成&#xff1a;输入设别&#xff0c;输出设备&#xff0c;控制器&#xff0c;运算器&#xff0c;存储器;指令和疏忽都以同等地位存于存储器…

为什么年轻人都热衷找搭子,而不是找对象?

在繁华的都市中&#xff0c;有一个名叫晓悦的年轻人。晓悦每天穿梭于忙碌的工作和快节奏的生活之间&#xff0c;渐渐地&#xff0c;她发现身边的朋友们都开始找起了 “搭子”。 有一天&#xff0c;晓悦结束了一天疲惫的工作&#xff0c;坐在咖啡店里&#xff0c;看着窗外匆匆而…

为写论文头疼?推荐4款ai写毕业论文初稿的软件

写论文对于许多学生来说是一项既重要又具挑战性的任务。为了帮助大家更高效地完成这一过程&#xff0c;我将推荐四款优秀的AI写毕业论文初稿的软件&#xff0c;并详细介绍它们的功能和优势。 传送门&#xff1a;https://www.aipaperpass.com?piclLGw 千笔-AIPassPaper是一款功…

面向对象例题之例题的特性

答案&#xff1a;C 解析&#xff1a;对象里面的方法和属性数量是不确定的&#xff0c;可以不断扩展写多个属性和方法 清洗的边界是对象必备的&#xff0c;哪些是这个类的&#xff0c;哪些是其他类的都有体现。 良好的定义行为一般指定义良好的属性和方法 可扩展性指的是子类…

【问题随记】在使用 AuthenticationManager 的时候,出现循环依赖问题 —— `java.lang.StackOverflowError`

问题随记 在使用 AuthenticationManager 的时候&#xff0c;出现循环依赖问题 —— java.lang.StackOverflowError&#xff0c;查资料查了两天半&#xff0c;终于找到原因。 2024-06-16T17:54:19.48708:00 ERROR 20672 --- [nio-8789-exec-1] o.a.c.c.C.[.[.[/].[dispatcherS…

波分技术基础 -- FEC

信号在传输过程中&#xff0c;不可避免的会出现劣化、误码&#xff0c;FEC (Forward error correction) 技术确保通信系统在噪声和其他损伤的影响下&#xff0c;依然能够实现无错误传输。 应用场景&#xff1a;长途密集波分系统&#xff08;DWDM&#xff09;实现方式&#xff…

LED显示屏迎来革新:GOB封装技术引领行业新风尚

在我们日常生活中&#xff0c;LED显示屏无处不在&#xff0c;从繁华的街头广告牌到家庭娱乐中心的大屏幕电视&#xff0c;它们都以鲜明的色彩和清晰的画质吸引着我们的目光。然而&#xff0c;在LED显示屏技术日新月异的今天&#xff0c;一种名为GOB&#xff08;Glue On Board&a…

python:给1个整数,你怎么判断是否等于2的幂次方?

最近在csdn上刷到一个比较简单的题目&#xff0c;题目要求不使用循环和递归来实现检查1个整数是否等于2的幂次方&#xff0c;题目如下&#xff1a; 题目的答案如下&#xff1a; def isPowerofTwo(n):z bin(n)[2:]print(bin(n))if z[0] ! 1:return Falsefor i in z[1:]:if i !…

华为全联接大会HUAWEI Connect 2024印象(二):昇腾AI端侧推理

此次参加HUAWEI Connect 2024最主要目标是了解昇腾AI端侧推理技术&#xff0c;希望将其融合到我现在嵌入式系统课程中&#xff0c;不过刚开始在一楼找到一个小展台&#xff0c;看到了香橙派Orange Pi。香橙派是深圳迅龙的一个品牌&#xff0c;他们和很多芯片厂商都合作过&#…

IPsec-VPN中文解释

网络括谱图 IPSec-VPN 配置思路 1 配置IP地址 FWA:IP地址的配置 [FW1000-A]interface GigabitEthernet 1/0/0 [FW1000-A-GigabitEthernet1/0/0]ip address 10.1.1.1 24 //配置IP地址 [FW1000-A]interface GigabitEthernet 1/0/2 [FW1000-A-GigabitEthernet1/0/2]ip a…