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

devtools/2024/9/22 11:03:06/

目录

题目链接: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.ppmy.cn/devtools/115432.html

相关文章

【工具变量】科技金融试点城市DID数据集(2000-2023年)

时间跨度&#xff1a;2000-2023年数据范围&#xff1a;286个地级市包含指标&#xff1a; year city treat post DID&#xff08;treat*post&#xff09; 样例数据&#xff1a; 包含内容&#xff1a; 全部内容下载链接&#xff1a; 参考文献-pdf格式&#xff1a;https://…

LangChain教程 - 向量存储与检索器

系列文章索引 LangChain教程 - 系列文章 介绍 在这个教程中&#xff0c;你将了解 LangChain 的向量存储和检索器抽象。这些抽象旨在支持从&#xff08;向量&#xff09;数据库和其他来源检索数据&#xff0c;并将其集成到大语言模型&#xff08;LLM&#xff09;的工作流程中。…

AWS账号可以共用吗?

小伙伴们&#xff0c;大家好&#xff01;今天九河云来聊聊另一个大家可能关心的问题&#xff1a;AWS账号可以共用吗&#xff1f;很多团队或公司在使用AWS服务时&#xff0c;可能会考虑共用一个账号以节省成本或者简化管理。那么&#xff0c;这样做是否可行呢&#xff1f;让我们…

WebGL缓冲区

一、缓冲区对象 缓冲区对象时WebGL系统中的一块内存区域&#xff0c;可以一次性地向缓冲区对象中填充大量的顶点数据&#xff0c;然后将这些数据保存其中&#xff0c;供顶点着色器使用。 类型化数组 这样程序可以预知数组中的类型&#xff0c;提高性能 类型描述Int8Array8位…

弃置区原因

线性卷积&#xff0c;不用担心滤波器周期化的情况。圆周卷积在一周期内&#xff0c;一定有所有的点&#xff0c;所以信号进来的时候&#xff0c;剩下的信号一定在周期内&#xff0c;导致卷积结果不正确。 补零的圆周卷积就是为了&#xff0c;信号进来的时候&#xff0c;让其他的…

数据结构--树和二叉树

目录 一.树概念及结构(了解) 1.1树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它 叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 有一个特…

【JAVA开源】基于Vue和SpringBoot的在线文档管理系统

本文项目编号 T 038 &#xff0c;文末自助获取源码 \color{red}{T038&#xff0c;文末自助获取源码} T038&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

Java项目实战II基于Java+Spring Boot+MySQL的大型商场应急预案管理系统(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、论文参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 在快节奏的…