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

LeetCode 热题 100_搜索二维矩阵(64_74_中等_C++)(二分查找)(暴力破解法;Z字形查找;一次二分查找)

LeetCode 热题 100_搜索二维矩阵(64_74)

    • 题目描述:
    • 输入输出样例:
    • 题解:
      • 解题思路:
        • 思路一(暴力破解法):
        • 思路二(Z字形查找):
        • 思路三(一次二分查找(将二维转换为一维)):
      • 代码实现
        • 代码实现(思路一(暴力破解法)):
        • 代码实现(思路二(Z字形查找)):
        • 代码实现(思路三(一次二分查找(将二维转换为一维))):
        • 以思路三为例进行调试
        • 部分代码解读

题目描述:

给你一个满足下述两条属性的 m x n 整数矩阵:

每行中的整数从左到右按非严格递增顺序排列。
每行的第一个整数大于前一行的最后一个整数。
给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false 。

输入输出样例:

示例 1:
在这里插入图片描述

输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
输出:true

示例 2:
在这里插入图片描述

输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13
输出:false

提示:
m== matrix.length
n == matrix[i].length
1 <= m, n <= 100
-104 <= matrix[i][j], target <= 104

题解:

解题思路:

思路一(暴力破解法):

1、将二维矩阵每个元素与target进行比较。
2、复杂度分析:
① 时间复杂度:O(mn),其中m和n分别是矩阵的行数和列数。
② 空间复杂度:O(1)。

思路二(Z字形查找):

1、选取划分的区间:
① 发现右上角元素的左侧是比其小的元素,下方是比其大的元素(仅看当前元素所在的行和列)。
② 发现左下角元素的上侧是比其小的元素,右侧是比其大的元素(仅看当前元素所在的行和列)。
③ 而左上角和右下角则不能划分大小区间
选择以左下角元素为基准元素,(也可选右上角元素为基准元素)
相似题目(讲解更详细):
LeetCode 热题 100_搜索二维矩阵 II(21_240_中等_C++)(Z 字形查找)

2、复杂度分析
① 时间复杂度:O(m+n),其中m和n分别为矩阵行数和列数,此算法最多循环 m+n 次。
② 空间复杂度:O(1)。

思路三(一次二分查找(将二维转换为一维)):

1、将二维数组看作是一维数组进行处理(运用“%”映射到一维)。
例:
在这里插入图片描述
按照一维数组空间展开为:[1,3,5,7,10,11,16,20,23,30,34,60]
一维:中间元素取11,其下标为 5
二维:中间元素取11,其下标为 [1,1]
5/3(column_size)=1(行)
5%4(column_size)=1(列)
一维和二维的对应关系为:
一维元素的下标 / 矩阵列数 = 二维元素的行下标
一维元素的下标 % 矩阵列数 = 二维元素的列下标

2、复杂度分析:
① 时间复杂度:O(logmn),其中m和n分别是矩阵的行数和列数。
② 空间复杂度:O(1)。

代码实现

代码实现(思路一(暴力破解法)):
bool searchMatrix1(vector<vector<int>>& matrix, int target) {for (int row = 0; row < matrix.size(); row++){for (int col = 0; col < matrix[0].size(); col++){if(matrix[row][col]==target){return true;}}}return false;
}
代码实现(思路二(Z字形查找)):
bool searchMatrix2(vector<vector<int>>& matrix, int target) {// 初始化row为矩阵的最后一行,col为矩阵的第一列(左下角元素)int row = matrix.size() - 1;int col = 0;// 循环直到超出矩阵边界while (row >= 0 && col < matrix[0].size()) {// 如果当前元素等于目标值,返回trueif (matrix[row][col] == target) {return true;}// 如果当前元素大于目标值,说明目标值在当前行的上方,向上移动一行else if (matrix[row][col] > target) {--row;}// 如果当前元素小于目标值,说明目标值在当前列的右侧,向右移动一列else {++col;}}// 如果没有找到目标值,返回falsereturn false;
}
代码实现(思路三(一次二分查找(将二维转换为一维))):
//方法三:一次二分查找
bool searchMatrix3(vector<vector<int>>& matrix, int target) {// 获取二维数组的行数和列数int row_size = matrix.size(), col_size = matrix[0].size();// 初始化二分查找的左边界和右边界// 通过将二维矩阵转换成一维数组来处理int left = 0, right = row_size * col_size - 1, mid;// 当左边界不超过右边界时,继续进行二分查找while (left <= right) {// 计算中间索引 mid,使用位移操作 >>1 代替除以2,提高效率mid = left + ((right - left) >> 1);// 将中间索引对应到二维矩阵中的位置,mid / col_size 为行,mid % col_size 为列int x = matrix[mid / col_size][mid % col_size];// 如果目标值小于当前值,移动右边界if (x > target) {right = mid - 1;}// 如果目标值大于当前值,移动左边界else if (x < target) {left = mid + 1;}// 找到目标值,返回 trueelse {return true;}}// 如果未找到目标值,返回 falsereturn false;
}
以思路三为例进行调试
#include<iostream>
#include<vector>
using namespace std;class Solution {
public://方法三:一次二分查找bool searchMatrix3(vector<vector<int>>& matrix, int target) {// 获取二维数组的行数和列数int row_size = matrix.size(), col_size = matrix[0].size();// 初始化二分查找的左边界和右边界// 通过将二维矩阵转换成一维数组来处理int left = 0, right = row_size * col_size - 1, mid;// 当左边界不超过右边界时,继续进行二分查找while (left <= right) {// 计算中间索引 mid,使用位移操作 >>1 代替除以2,提高效率mid = left + ((right - left) >> 1);// 将中间索引对应到二维矩阵中的位置,mid / col_size 为行,mid % col_size 为列int x = matrix[mid / col_size][mid % col_size];// 如果目标值小于当前值,移动右边界if (x > target) {right = mid - 1;}// 如果目标值大于当前值,移动左边界else if (x < target) {left = mid + 1;}// 找到目标值,返回 trueelse {return true;}}// 如果未找到目标值,返回 falsereturn false;}};int main(){vector<vector<int>> matrix={{1,3,5,7},{10,11,16,20},{23,30,34,60}};int target=3;Solution s;if (s.searchMatrix3(matrix,target)){cout<<"true";}else{cout<<"false";}return 0;
}
部分代码解读

”>>“ 与 “/” 对比 :LeetCode 热题 100_搜索插入位置(63_35_简单_C++):请点击此链接查看部分代码解读部分

LeetCode 热题 100_搜索二维矩阵(64_74)原题链接
欢迎大家和我沟通交流(✿◠‿◠)

相关文章:

LeetCode 热题 100_搜索二维矩阵(64_74_中等_C++)(二分查找)(暴力破解法;Z字形查找;一次二分查找)

LeetCode 热题 100_搜索二维矩阵&#xff08;64_74&#xff09; 题目描述&#xff1a;输入输出样例&#xff1a;题解&#xff1a;解题思路&#xff1a;思路一&#xff08;暴力破解法&#xff09;&#xff1a;思路二&#xff08;Z字形查找&#xff09;&#xff1a;思路三&#x…...

学习量化交易的环境安装记录

1、安装anaconda 因为使用python&#xff0c;需要安装anaconda&#xff0c;具体是下面的官方地址&#xff0c;根据自己需要下载相应的版本 https://www.anaconda.com/download 运行上面下载的文件&#xff0c;安装anaconda 可以根据自己需要安装到相应的盘上面 同时环境变量…...

MySQL数据库入门到大蛇尚硅谷宋红康老师笔记 高级篇 part 1

第01章_Linux下MySQL的安装与使用 首先在vmware中下载centos7&#xff0c;实际上8更好一点&#xff0c;不过centos已经是时代的眼泪了&#xff0c;我之前已经教过了&#xff0c;不过是忘了&#xff0c;所以重新说一遍&#xff0c;看文档即可 2.开机前修改mac地址 &#xff0…...

基于AVue的二次封装:快速构建后台管理系统的CRUD方案

基于AVue的二次封装&#xff1a;快速构建后台管理系统的CRUD方案 在开发后台管理系统时&#xff0c;表格是常见的组件之一。然而&#xff0c;使用原生的Element Plus实现CRUD&#xff08;增删改查&#xff09;功能往往需要编写大量重复代码&#xff0c;过程繁琐。即使借助类似…...

第6章:基于LangChain如何开发Agents,附带客户支持智能体示例

本文主要介绍了 LangChain4j 中的 Agent&#xff08;代理&#xff09; 概念&#xff0c;以及如何使用 LangChain4j 构建代理系统&#xff0c;重点提供了一个客户支持系统的智能体样例 代理&#xff08;Agents&#xff09;| LangChain4j 注意&#xff1a; 请注意&#xff0c;“A…...

【分布式理论13】分布式存储:数据存储难题与解决之道

文章目录 一、数据存储面临的问题二、RAID磁盘阵列的解决方案1. RAID概述2. RAID使用的技术3. RAID的代表性等级 三、分布式存储的新思路1. 分布式存储背景与特点2. 分布式存储的组成要素 一、数据存储面临的问题 在单机系统时代&#xff0c;当数据量不断增加、硬盘空间不够时…...

传统的自动化行业的触摸屏和上位机,PLC是否会被取代?

传统的自动化行业的触摸屏和上位机是否会被取代&#xff1f; 在工业自动化领域&#xff0c;触摸屏和上位机长期扮演着核心角色&#xff0c;尤其在污水处理、化工生产等场景中&#xff0c;它们通过实时数据采集、逻辑控制、报警联动等功能&#xff0c;保障了生产设备的稳定运行…...

智能合约的部署

https://blog.csdn.net/qq_40261606/article/details/123249473 编译 点击图中的 “Compile 1_Storage.sol” 存和取一个数的合约&#xff0c;remix自带 pragma solidity >0.8.2 <0.9.0; /*** title Storage* dev Store & retrieve value in a variable* custom:d…...

word$deepseep

1、进入官网地址。 DeepSeek 2、进入DeepSeek的API文档 3、点击DeepSeek开放平台左侧的“API Keys”, 再点击“创建API Key” 4、在弹出的对话框中&#xff0c;输入自己的API Key名称&#xff0c;点击创建。 sk-0385cad5e19346a0a4ac8b7f0d7be428 5、打开Word文档。 6、Word找…...

Redis中集合(Set)常见命令详解

集合&#xff08;Set&#xff09;常见命令详解 集合&#xff08;Set&#xff09;在Redis中是一种无序且不可重复的数据结构&#xff0c;非常适合用于存储唯一元素的集合。以下是Redis集合操作的一些常用命令及其详细说明&#xff1a; 添加成员 sadd key member [member ...]…...

Perl 面向对象编程指南

Perl 面向对象编程指南 引言 Perl 是一种强大的编程语言&#xff0c;以其灵活性和强大的文本处理能力而闻名。随着软件工程的发展&#xff0c;面向对象编程&#xff08;OOP&#xff09;已经成为现代编程的主流。本文将深入探讨 Perl 的面向对象编程&#xff0c;包括其基本概念…...

用 WOW.js 和 animate.css 实现动画效果

用 wow.js 就可以实现动画效果&#xff0c;但由于里面的动画样式太少&#xff0c;一般还会引入 animated.css 第一步&#xff1a;下载 选择合适的包管理器下载对应的内容 pnpm i wow.js animated.css --save 第二步&#xff1a;引入 在main.js中加入&#xff1a; import …...

Mac系统下使用Docker快速部署MaxKB:打造本地知识库问答系统

随着大语言模型的广泛应用&#xff0c;知识库问答系统逐渐成为提升工作效率和个人学习的有力工具。MaxKB是一款基于LLM&#xff08;Large Language Model&#xff09;大语言模型的知识库问答系统&#xff0c;支持多模型对接、文档上传和自动爬取等功能。本文将详细介绍如何在Ma…...

PyTorch torch.logsumexp 详解:数学原理、应用场景与性能优化(中英双语)

PyTorch torch.logsumexp 详解&#xff1a;数学原理、应用场景与性能优化 在深度学习和概率模型中&#xff0c;我们经常需要计算数值稳定的对数概率操作&#xff0c;特别是在处理 softmax 归一化、对数似然计算、损失函数优化 等任务时&#xff0c;直接求和再取对数可能会导致…...

如何为自己的 PDF 文件添加密码?在线加密 PDF 文件其实更简单

随着信息泄露和数据安全问题的日益突出&#xff0c;保护敏感信息变得尤为重要。加密 PDF 文件是一种有效的手段&#xff0c;可以确保只有授权用户才能访问或修改文档内容。本文将详细介绍如何使用 CleverPDF 在线工具为你的 PDF 文件添加密码保护&#xff0c;确保其安全性。 为…...

华为昇腾910b服务器部署DeepSeek翻车现场

最近到祸一台HUAWEI Kunpeng 920 5250&#xff0c;先看看配置。之前是部署的讯飞大模型&#xff0c;发现资源利用率太低了。把5台减少到3台&#xff0c;就出了他 硬件配置信息 基本硬件信息 按照惯例先来看看配置。一共3块盘&#xff0c;500G的系统盘&#xff0c; 2块3T固态…...

hive—常用的函数整理

1、size(split(...))函数用于计算分割后字符串数组的长度 实例1&#xff09;&#xff1a;由客户编号列表计算客户编号个数 --数据准备 with tmp_test01 as ( select tag074445270 tag_id,202501busi_mon , 012399931003,012399931000 index_val union all select tag07444527…...

深入浅出机器学习:概念、算法与实践

目录 引言 机器学习的基本概念 什么是机器学习 机器学习的基本要素 机器学习的主要类型 监督学习&#xff08;Supervised Learning&#xff09; 无监督学习&#xff08;Unsupervised Learning&#xff09; 强化学习&#xff08;Reinforcement Learning&#xff09; 机器…...

Unity Mirror 多房间匹配

文章目录 一 、一些唠叨二 、案例位置三、多房间匹配代码解析四、关于MatchInterestManagement五、总结 一 、一些唠叨 最近使用Mirror开发了一款多人同时在线的肉鸽塔防游戏,其目的是巩固一下Mirror这个插件的熟练度,另一方面是想和身边的朋友一起玩一下自己开发的游戏. 但是…...

基于flask+vue框架的的医院预约挂号系统i1616(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。

系统程序文件列表 项目功能:用户,医生,科室信息,就诊信息,医院概况,挂号信息,诊断信息,取消挂号 开题报告内容 基于FlaskVue框架的医院预约挂号系统开题报告 一、研究背景与意义 随着医疗技术的不断进步和人们健康意识的日益增强&#xff0c;医院就诊量逐年增加。传统的现场…...

Rust编程语言入门教程(五)猜数游戏:生成、比较神秘数字并进行多次猜测

Rust 系列 &#x1f380;Rust编程语言入门教程&#xff08;一&#xff09;安装Rust&#x1f6aa; &#x1f380;Rust编程语言入门教程&#xff08;二&#xff09;hello_world&#x1f6aa; &#x1f380;Rust编程语言入门教程&#xff08;三&#xff09; Hello Cargo&#x1f…...

ubuntu部署小笔记-采坑

ubuntu部署小笔记 搭建前端控制端后端前端nginx反向代理使用ubuntu部署nextjs项目问题一 如何访问端口号配置后台运行该进程pm2 问题二 包体过大生产环境下所需文件 问题三 部署在vercel时出现的问题需要魔法访问后端api时&#xff0c;必须使用https协议电脑端访问正常&#xf…...

【代码审计】-Tenda AC 18 v15.03.05.05 /goform接口文档漏洞挖掘

路由器&#xff1a;Tenda AC 18 v15.03.05.05 固件下载地址&#xff1a;https://www.tenda.com.cn/material?keywordac18 1./goform/SetSpeedWan 接口文档&#xff1a; formSetSpeedWan函数中speed_di参数缓冲区溢出漏洞&#xff1a; 使用 binwalk -eM 解包固件&#xff0c…...

2025年02月21日Github流行趋势

项目名称&#xff1a;source-sdk-2013 项目地址url&#xff1a;https://github.com/ValveSoftware/source-sdk-2013项目语言&#xff1a;C历史star数&#xff1a;7343今日star数&#xff1a;929项目维护者&#xff1a;JoeLudwig, jorgenpt, narendraumate, sortie, alanedwarde…...

git 克隆及拉取github项目到本地微信开发者工具,微信开发者工具通过git commit、git push上传代码到github仓库

git 克隆及拉取github项目到本地微信开发者工具&#xff0c;微信开发者工具通过git commit、git push上传代码到github仓库 git 克隆及拉取github项目到本地 先在自己的用户文件夹新建一个项目文件夹&#xff0c;取名为项目名 例如这样 C:\Users\HP\yzj-再打开一个终端页面&…...

【算法基础】--前缀和

前缀和 一、一维前缀和示例模板[寻找数组的中心下标 ](https://leetcode.cn/problems/tvdfij/description/)除自身以外的数组乘积和可被k整除的子数组 一、一维前缀和 前缀和就是快速求出数组某一个连续区间内所有元素的和。 示例模板 已知一个数组arr&#xff0c;求前缀和 …...

统一的多摄像头3D感知框架!PETRv2论文精读

论文地址&#xff1a;PETRv2: A Unified Framework for 3D Perception from Multi-Camera Images 源代码&#xff1a;PETR 摘要 在本文中&#xff0c;我们提出了PETRv2&#xff0c;用于从多视角图像中进行3D感知的统一框架。基于PETR [24]&#xff0c;PETRv2探索了时间建模的…...

【Linux】Linux 文件系统—— 探讨软链接(symbolic link)

ℹ️大家好&#xff0c;我是练小杰&#xff0c;周五又到了&#xff0c;明天应该就是牛马的休息日了吧&#xff01;&#xff01;&#x1f606; 前天我们详细介绍了 硬链接的特点&#xff0c;现在继续探讨 软链接的特点&#xff0c;并且后续将添加更多相关知识噢&#xff0c;谢谢…...

快速排序_912. 排序数组(10中排序算法)

快速排序_912. 排序数组&#xff08;10中排序算法&#xff09; 1 快速排序&#xff08;重点&#xff09;报错代码超时代码修改官方题解快速排序 1&#xff1a;基本快速排序快速排序 2&#xff1a;双指针&#xff08;指针对撞&#xff09;快速排序快速排序 3&#xff1a;三指针快…...

DEMF模型赋能多模态图像融合,助力肺癌高效分类

目录 论文创新点 实验设计 1. 可视化的研究设计 2. 样本选取和数据处理 3. 集成分类模型 4. 实验结果 5. 可视化结果 图表总结 可视化知识图谱 在肺癌早期筛查中,计算机断层扫描(CT)和正电子发射断层扫描(PET)作为两种关键的影像学手段,分别提供了丰富的解剖结构…...