【算法笔记】5.LeetCode-Hot100-矩阵专项

1. 矩阵置零(t73)

中等难度,题目示例如下:

给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用原地算法。示例 1:
输入:matrix = [[1,1,1],[1,0,1],[1,1,1]]
输出:[[1,0,1],[0,0,0],[1,0,1]]示例 2:
输入:matrix = [[0,1,2,0],[3,4,5,2],[1,3,1,5]]
输出:[[0,0,0,0],[0,4,5,0],[0,3,1,0]]

思路分析:看到这题,一个朴素的思想是,只要遇到 0 的元素就去查询同行同列,但这样操作搜索的复杂度过高。看题解可以采用一个标记数组,相当于复制一个矩阵,如果遇到有元素为0,就将其行和列标记为true,最后再遍历一次矩阵,对标记的部分置零。

class Solution {
public:void setZeroes(vector<vector<int>>& matrix) {int m = matrix.size();int n = matrix[0].size();vector<int> row(m), col(n);for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {if (!matrix[i][j]) {row[i] = col[j] = true;}}}for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {if (row[i] || col[j]) {matrix[i][j] = 0;}}}}
};

2. 螺旋矩阵(t54)

中等难度,题目示例如下:

给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。示例 1:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]示例 2:
输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]

思路分析:可以从两个角度去考虑,第一个角度是从纯数理的方式去找规律,比如转向等操作可以通过对宽高取模来判断,但理解起来较抽象;第二个角度是直接从矩阵结构入手,用四个变量去跟踪矩阵的边界,下面以这个思路进行求解。

class Solution {
public:vector<int> spiralOrder(vector<vector<int>>& matrix) {vector<int> ans;if (matrix.empty()) return ans;int rows = matrix.size();int cols = matrix[0].size();int up = 0, down = rows - 1;int left = 0, right = cols - 1;while (true) {// 向右for (int i = left; i <= right; i++) {ans.push_back(matrix[up][i]);}up++;if (up > down) break;// 向下for (int i = up; i <= down; i++) {ans.push_back(matrix[i][right]);}right--;if (right < left) break;// 向左for (int i = right; i >= left; i--) {ans.push_back(matrix[down][i]);}down--;if (down < up) break;// 向上for (int i = down; i >= up; i--) {ans.push_back(matrix[i][left]);}left++;if (left > right) break;}return ans;}
};

3. 旋转图像(t48)

中等难度,题目示例如下:

给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要使用另一个矩阵来旋转图像。示例 1:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[[7,4,1],[8,5,2],[9,6,3]]示例 2:
输入:matrix = [[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]]
输出:[[15,13,2,5],[14,3,4,1],[12,6,8,9],[16,7,10,11]]

思路分析:这题最简单的思路就是直接找旋转的图像的规律,仔细观察就可以发现,旋转这个操作,等价于对角线翻转+左右翻转。下面稍微注意的是,做对角线翻转只需要遍历矩阵的上三角。

class Solution {
public:void rotate(vector<vector<int>>& matrix) {int rows = matrix.size();int cols = matrix[0].size();// 对角线翻转for (int i = 0; i < rows; i++){for (int j = i; j < cols; j++){swap(matrix[i][j], matrix[j][i]);}}// 左右翻转for (int i = 0; i < rows; i++){for (int j = 0; j < cols / 2; j++){swap(matrix[i][j], matrix[i][cols - 1 - j]);}}}
};

4. 搜索二维矩阵 II(t240)

中等难度,题目示例如下:

编写一个高效的算法来搜索 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

思路分析:这道题直接用暴力法很容易求解,可以直接按先列后行的顺序搜索,一旦遇到大于 target 的值,就提前跳出,节省时间。

class Solution {
public:bool searchMatrix(vector<vector<int>>& matrix, int target) {int rows = matrix.size();int cols = matrix[0].size();for (int i = 0; i < rows; i++){for (int j = 0; j < cols; j++){if (matrix[i][j] == target) return true;else if (matrix[i][j] > target) break; }}return false;}
};

题目中,每行每列都已经是排序好的,因此显然存在更优方案,看了用户 Krahets 的题解恍然大悟,把矩阵逆时针旋转 45°,就变成了类似二叉搜索树的结构。

图源:https://leetcode.cn/problems/search-a-2d-matrix-ii/solutions/2361487/240-sou-suo-er-wei-ju-zhen-iitan-xin-qin-7mtf/

因此,可以从矩阵的左下角出发,如果左下角大于target,则往上移动一行,如果小于target,则可以直接往右搜索。

class Solution {
public:bool searchMatrix(vector<vector<int>>& matrix, int target) {int i = matrix.size() - 1, j = 0;while(i >= 0 && j < matrix[0].size()){if(matrix[i][j] > target) i--;else if(matrix[i][j] < target) j++;else return true;}return false;}
};

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

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

相关文章

ORACLE 日常查询

一. 查询索引相关1. 查询索引所在的表空间&#xff0c;单个索引的大小SELECT ui.table_name, us.segment_name AS index_name, us.tablespace_name,ROUND(SUM(us.bytes) / 1024 / 1024 / 1024, 2) AS total_size_GB FROM dba_indexes ui JOIN dba_segments us ON ui.index_name…

【DeepSeek实战】17、MCP地图服务集成全景指南:高德、百度、腾讯三大平台接入实战

引言:为什么MCP是地图服务的下一代革命? 在数字化时代,位置服务已成为电商、出行、物流等行业的核心基础设施。但单一地图服务商的局限性日益凸显:某外卖平台因高德地图API突发故障导致30分钟订单配送延迟,某打车软件因百度地图路线规划偏差引发用户投诉激增,某物流企业…

设计模式之【动态代理】

目录 动态代理中存在的概念 JDK动态代理 代理工厂【ProxyFactory】实现【InvocationHandler】 目标类的接口【TargetInterface】 目标类【Target】实现了接口 测试类【JDKDynamicProxyTest】 CGLIB动态代理 添加Maven依赖 代理工厂【ProxyFactory】实现【MethodInterc…

【Linux驱动-快速回顾】一次性快速回顾TTY体系知识点(新手友好)

我将遵循一条严格的“问题驱动”和“演进”的逻辑线索来构建整个TTY知识体系。每引入一个新概念&#xff0c;都是为了解决前一个阶段出现的问题。这样&#xff0c;你不仅能知道“是什么”&#xff0c;更能深刻理解“为什么是这样设计的”。 第〇阶段&#xff1a;最原始的需求 …

深入浅出:让机器听懂世界的耳朵——梅尔频率倒谱系数(MFCCs)

深入浅出&#xff1a;让机器听懂世界的耳朵——梅尔频率倒谱系数&#xff08;MFCCs&#xff09; 在人工智能的浪潮中&#xff0c;语音识别、声纹支付、音乐推荐等技术早已融入我们的日常生活。你是否曾好奇&#xff0c;计算机是如何理解并区分各种复杂的声音信号的&#xff1f;…

Ubuntu22.04安装/使用Gazebo时踩的一些坑

首先&#xff0c;本人原本打算安装gazebo11的&#xff0c;因为官方好像不支持ubuntu22.04&#xff0c;所以要通过PPA和ROS2 humble来安装&#xff0c;安装过程跟着教程来的&#xff0c;也就是下面这篇 ubuntu22.04安装gazebo11&#xff08;ROS2 Humble&#xff09;-CSDN博客 …

CPT203-Software Engineering: Introduction 介绍

目录 1.专业名词定义 1.1计算机软件的定义 1.2软件系统的定义 1.3软件工程的定义 2.软件的失败与成功 2.1 失败 2.2 成功 3.软件开发 Professional software development 3.1 分类 3.2 专业软件开发 professional software development 3.3专业软件开发产品特性 3.4…

诊断工程师进阶篇 --- 车载诊断怎么与时俱进?

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…

奥特曼论人工智能、OpenAI与创业

来自Y Combinator的YouTube视频&#xff0c;展示了OpenAI首席执行官萨姆奥特曼分享的深刻见解。他讨论了OpenAI从一个看似疯狂的通用人工智能&#xff08;AGI&#xff09;梦想&#xff0c;如何发展成为一个全球性的现象。奥特曼强调了早期决策的关键性、吸引顶尖人才的策略&…

React Ref使用

受控与非受控组件 Ref 1.获取原生dom 类组件中&#xff1a;在componentDidMount方法内使用document.getElementById的方法获取到dom元素 1 目标dom增加ref属性 设置为字符串 <h2 reftitleref></h2>function changeRef(){this.refs.titleref.innerHtml }2 函数组件…

地下管线安全的智能监测先锋:智能标志桩图像监测装置解析​

​在城市与乡村的地下&#xff0c;纵横交错的管线是能源与信息传输的关键通道。但深埋地下的电缆、燃气管道等设施&#xff0c;因难以直观监测&#xff0c;面临施工误挖、自然灾害等风险。传统防护手段力不从心&#xff0c;TLKS-PAZ01 智能标志桩图像监测装置的诞生&#xff0c…

Camera相机人脸识别系列专题分析之十六:人脸特征检测FFD算法之libcvface_api.so数据结构详细注释解析

【关注我&#xff0c;后续持续新增专题博文&#xff0c;谢谢&#xff01;&#xff01;&#xff01;】 上一篇我们讲了&#xff1a; 这一篇我们开始讲&#xff1a; Camera相机人脸识别系列专题分析之十六&#xff1a;人脸特征检测FFD算法之libcvface_api.so数据结构详细注释解析…

【字节跳动】数据挖掘面试题0012:数据分析、数据挖掘、数据建模的区别

文章大纲 数据分析、数据挖掘、数据建模的区别一、核心定义与目标二、技术方法差异三、应用场景对比四、三者的关联与递进关系五、面试应答策略 数据分析、数据挖掘、数据建模的区别 一、核心定义与目标 数据分析&#xff1a; 是对已有的数据进行收集、清洗、整理&#xff0c;并…

预警:病毒 “黑吃黑”,GitHub 开源远控项目暗藏后门

在开源生态蓬勃发展的当下&#xff0c;黑客们也将黑手伸向了代码共享平台。当黑产开发者以为在共享 “行业秘笈” 时&#xff0c;殊不知已经掉入了黑客布置的陷阱 —— 看似方便的后门远程控制源码和游戏作弊外挂源码等 “圈内资源”&#xff0c;实则是植入了恶意代码的投毒诱饵…

Qt中的QProcess类

Qt中的QProcess类 QProcess 是 Qt 框架中用于启动和控制外部进程的类&#xff0c;它属于 QtCore 模块。这个类提供了执行外部程序并与它们交互的功能。 一、主要功能 启动外部程序&#xff1a;可以启动系统上的其他可执行程序进程通信&#xff1a;通过标准输入、输出和错误流…

周任务自动化升级:N8N与多维表格无缝联动全解析

.自动化之言&#xff1a; 在上一篇文章中&#xff0c;我们介绍了如何利用多维表格&#xff08;如飞书多维表格或Notion&#xff09;搭建一个灵活的任务管理系统。现在我们将进一步扩展这个系统&#xff0c;借助 N8N 实现周报的自动汇总与邮件发送&#xff0c;真正实现任务管理…

Go语言的web框架--gin

本章内容&#xff0c;会介绍一下gin的运用&#xff0c;以及gin框架底层的内容&#xff0c;话不多说&#xff0c;开始进入今天的主题吧&#xff01; 一.基本使用 gin框架支持前后端不分离的形式&#xff0c;也就是直接使用模板的形式。 模板是什么&#xff1f; 这里可能有同…

企业为什么需要双因素认证?

从进入互联网时代开始&#xff0c;密码是我们个人日常的重要保护。但是单独的密码保护可能已经不再适应当前的数字化时代。密码已经不再足够安全最近发生的各种安全漏洞让我重新审视网络安全。几行代码可能就导致了全球数以百万的登录凭证被泄露。今天&#xff0c;仅仅周期性地…

Spring Boot + 本地部署大模型实现:优化与性能提升!

在Spring Boot中集成本地部署的大模型&#xff08;如LLaMA、ChatGLM等&#xff09;并进行优化&#xff0c;需要从模型选择、推理加速、资源管理和架构设计等多方面入手。以下是完整的优化方案及实现步骤&#xff1a; 一、核心优化策略 1. 模型量化 目标&#xff1a;减少显存占…

仿mudou库one thread oneloop式并发服务器

前言 我们所要实现的是一个高并发服务器的组件&#xff0c;使服务器的性能更加高效&#xff0c;是一个高并发服务器的组件&#xff0c;并不包含实际的业务。 首先需要先明确我们所要实现的目标是什么 第一点&#xff0c;实现一个高并发的服务器第二点&#xff0c;在服务器的基础…