hot100 -- 矩阵

👂 Peter Pan - kidult. - 单曲 - 网易云音乐

👂 Bibliothèque(图书馆) - Jasing Rye - 单曲 - 网易云音乐

目录

🌼前言

🌼二分模板

🎂矩阵置零

AC  标记数组

AC  标记变量

🚩螺旋矩阵

AC  模拟

🌼旋转图像

AC  转置 + 翻转

AC  辅助数组

🍃搜索二维矩阵 II

AC  二分

AC  Z字形查找


🌼前言

分享一个,24届,现在大四学长的经历

大二绩点专业第一,稳拿保研资格,大三翘课一年,全力冲刺工作实习,想着两手抓,结果错失保研资格,只能全力备战秋招....

最后,作为唯一一个本科生,和一堆研究生竞争,笔试全国第二,综合表现第一,逆风翻盘,成功入职大厂

想说下他笔试全国第二的秘诀之一,hot100 刷了七八遍,总题量 500 左右,笔试时随便一道 medium,hard,5 ~ 15分钟 AC

那么看来,我之前定的,大二结束前,二刷 hot100 可能不太够

那就大三再多刷两遍,无聊就刷刷

项目方面,他做了 webserver,6.824,另外还研究了 2 套源码,每套源码都写了十几篇 5000 字以上的博客记录

下个项目,我准备做 muduo 数据库项目,理由如下

  • 有个西邮的大二同学,打算和我一起做,但是他进度比我快一点
  • 手上有 2 个 muduo 讨论群,可以和不同进度的 uu 一起交流
  • 还有 1 套视频教程
  • 认识几个做了 6.824,Tiny KV,muduo,6.s081 的佬,没事厚着脸皮请教请教

手头可选的项目:6.s081,6.824,Tiny KV,muduo,CMU 15445,rcore,ucore

🌼二分模板

二分,难点在于边界的处理,这里分享两个 yxc 的模板👇

2.1 二分与前缀和 - AcWing

模板1 -- 整数二分

视频 1:02分 ~ 1:14分 介绍模板1

while (l < r) {int mid = (l + r + 1) >> 1; // 防止下取整死循环, 要 +1if (...) l = m; // 记住 l = melse r = m - 1;
}

模板2 -- 整数二分

while (l < r) {int mid = (l + r) >> 1; if (...)r = m; // 上面没 +1 就 r = melsel = m + 1;
}

🎂矩阵置零

73. 矩阵置零 - 力扣(LeetCode)

AC  标记数组

借助两个标记数组 r[], c[];r[3] = 1 表示第 3 行置 0;c[0] = 1 表示第 0 列置 0

注意:1)vector 要声明大小

时间O(mn)  空间O(m + n) 

class Solution {
public:void setZeroes(vector<vector<int>>& matrix) {int m = matrix.size(), n = matrix[0].size();// vector 要声明大小vector<int> r(m), c(n); // 行 / 列标记数组for (int i = 0; i < m; ++i)for (int j = 0; j < n; ++j)if (matrix[i][j] == 0)r[i] = 1, c[j] = 1; // 标记for (int i = 0; i < m; ++i) if (r[i] == 1)for (int j = 0; j < n; ++j)matrix[i][j] = 0;for (int j = 0; j < n; ++j) if (c[j] == 1)for (int i = 0; i < m; ++i) matrix[i][j] = 0;}
};

AC  标记变量

用原矩阵第 0 行,第 0 列代替原本的 r[] 和 c[](matrix[i][0] = 0 或 matrix[0][j] = 0 进行标记),此时 第 0 行,第 0 列是否包含 0 没办法记录

只需要借助两个变量 r, c 记录

注意:一开始我担心,遍历过程会破坏原本的第 0 行,第 0 列,并不会,因为某个位置 (i, j) 为 0,必然会使整行整列为 0,那么的 matrix[0][j] 和 matrix[i][0]  = 0 的标记,包含在里面

行是竖着下去的,列是横着往右的😂

时间 O(mn),空间 O(1)

class Solution {
public:void setZeroes(vector<vector<int>>& matrix) {int m = matrix.size(), n = matrix[0].size();int r = 0, c = 0; // 原来的第 0 行,第 0 列是否包含 0// 遍历for (int i = 0; i < m; ++i) for (int j = 0; j < n; ++j) {if (matrix[i][j] == 0 && i == 0)r = 1; // 列if (matrix[i][j] == 0 && j == 0)c = 1; // 行// 原矩阵第 0 行,第 0 列记录该行 / 列是否包含 0if (matrix[i][j] == 0)matrix[0][j] = 0, matrix[i][0] = 0; // 标记}// 置零for (int i = 1; i < m; ++i) if (matrix[i][0] == 0) // 第 i 行置 0for (int j = 0; j < n; ++j) matrix[i][j] = 0; for (int j = 1; j < n; ++j) if (matrix[0][j] == 0) // 第 j 列置 0for (int i = 0; i < m; ++i) matrix[i][j] = 0;if (r == 1) for (int j = 0; j < n; ++j)matrix[0][j] = 0;if (c == 1)for (int i = 0; i < m; ++i)matrix[i][0] = 0;}
};

🚩螺旋矩阵

54. 螺旋矩阵 - 力扣(LeetCode)

AC  模拟

坑....vector,初始声明大小后,不要用 push_back(),只会在后面追加....否则就会内存溢出

一道模拟题

通过维护 up, down, right, left,四个边界值,边界值每次碰壁都会收缩

比如一开始走完上边,上边界++,达到收缩的目的

时间 O(m*n),空间 O(1)

class Solution {
public:vector<int> spiralOrder(vector<vector<int>>& matrix) {int m = matrix.size(), n = matrix[0].size();vector<int> ans(m*n);// 边界值, 每次碰壁都会收缩int left = 0, right = n - 1, up = 0, down = m - 1;int i = 0, j = 0, cnt = 0;ans[cnt++] = matrix[i][j]; // 插入起点while (1) {while (cnt < m*n) { // 向右if (j < right)j++;else break;ans[cnt++] = matrix[i][j];}up++; // 上边走完后,上边界收缩while (cnt < m*n) { // 向下if (i < down)i++;else break;ans[cnt++] = matrix[i][j];}right--; // 右边走完,右边界收缩while (cnt < m*n) { // 向左if (j > left)j--;else break;ans[cnt++] = matrix[i][j];}down--; // 下面走完,下边界收缩while (cnt < m*n) { // 向上if (i > up)i--;else break;ans[cnt++] = matrix[i][j];}left++; // 左边走完,左边界收缩if (cnt == m*n) break;}return ans;}
};

🌼旋转图像

48. 旋转图像 - 力扣(LeetCode)

AC  转置 + 翻转

先矩阵转置(行列互换),再对称翻转

先矩阵转置(只需遍历对角线右侧)👇

(i, j),(j, i) 互换

再左右对称翻转,(i, j) 与 (i, n - j - 1) 互换,列的范围 < n/2 即可

时间 O(n^2),空间 O(1)

class Solution {
public:void rotate(vector<vector<int>>& matrix) {int n = matrix.size();// 矩阵转置for (int i = 0; i < n; ++i) for (int j = i + 1; j < n; ++j) {int temp = matrix[i][j];matrix[i][j] = matrix[j][i];matrix[j][i] = temp;  }// 左右对称翻转for (int i = 0; i < n; ++i)for (int j = 0; j < n / 2; ++j) {int temp = matrix[i][j];matrix[i][j] = matrix[i][n - j - 1];matrix[i][n - j - 1] = temp;}}
};

AC  辅助数组

假设原矩阵 (i ,j)

新的列就是原矩阵的行 i,新的行就是原矩阵的 n - j - 1

所以新 (i, j) = 原 (n - j - 1, i)

时间 O(n^2),空间 O(n^2)

class Solution {
public:void rotate(vector<vector<int>>& matrix) {int n = matrix.size();auto matrix_e = matrix; // 值拷贝for (int i = 0; i < n; ++i) for (int j = 0; j < n; ++j) matrix_e[i][j] = matrix[n - j - 1][i];// 最后要值拷贝回原数组matrix = matrix_e;}
};

🍃搜索二维矩阵 II

240. 搜索二维矩阵 II - 力扣(LeetCode)

AC  二分

思路:遍历每一行,对该行二分

二分难点在于死循环,最好背背上面的模板,具体原因是,防止 L = R - 1 后进入死循环

时间 O(mlogn),空间 O(1)

class Solution {
public:bool searchMatrix(vector<vector<int>>& matrix, int target) {int m = matrix.size(), n = matrix[0].size();for (int i = 0; i < m; ++i) {int l = 0, r = n - 1; // 下标作为左右端点while (l < r) { // 二分查找每一行int mid = (l + r + 1) >> 1;if (matrix[i][mid] <= target)l = mid;else if (matrix[i][mid] > target)r = mid - 1;}// 退出 while 后 l == rif (matrix[i][l] == target)return true;}return false;}
};

AC  Z字形查找

利用好这两个性质👇

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

我们将 target 可能的范围,划分到当前元素 (i, j) 往左往下的长方形中

从右上角开始

如果 target 大于当前元素,有两种选择,往左 或 往下

考虑到行 / 列是有序的,只能往下 i++

如果 target 小于当前元素,只能往左 j--

时间 O(m + n),空间 O(1)

class Solution {
public:bool searchMatrix(vector<vector<int>>& matrix, int target) {int m = matrix.size(), n = matrix[0].size();int i = 0, j = n - 1; // 右上角开始while (i >= 0 && i < m && j >= 0 && j < n) {if (target < matrix[i][j])j--; // 目标值更小,只能往左else if (target > matrix[i][j])i++; // 目标值更大,只能向下else return true; // target == }return false;}
};

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

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

相关文章

REDHAWK——连接

文章目录 前言一、连接过程二、为什么要使用端口三、端口访问四、动态连接五、标准化数据接口六、BulkIO1、流 API①、数据类型②、输出流<1>、创建<2>、修改流元数据<3>、写入<4>、写入复数数据<5>、写缓冲<6>、关闭 ③、输入流<1>…

手机中的8款万能App推荐!

目录 1.全能AI工具箱——HuluAI 2.AI视频生成——巨日禄 3.全能办公套件——鲸鲮Office 4.视频音频转换器——VideotoMP3Converter 5.特效滤镜摄影——PicsArt 6.智能工具箱——SmartTools 7.手机视频编辑软件——KineMaster 8.安卓版万能文档阅读器——AllDocumentRea…

蓝桥杯单片机快速开发笔记——矩阵键盘

一、原理分析 二、思维导图 三、示例框架 定义了四个位控制变量&#xff0c;用于控制键盘扫描时的行列信号。 在Scan_Keys()函数中&#xff0c;首先设置行列信号&#xff0c;将其中一个行信号置为0&#xff0c;另一个行信号置为1&#xff0c;同时将列信号置为1&#xff0c;用于…

Python基础入门 --- 5.函数

文章目录 Python基础入门5.函数5.1 基本定义5.2 传入参数5.3 返回值5.3.1 None类型 5.4 说明文档5.5 嵌套调用 Python基础入门 5.函数 定义&#xff1a;可重复使用&#xff0c;用来实现特定功能的代码段。 # 不使用内置函数len&#xff0c;统计字符串的长度 str "Hell…

AI预测福彩3D第10弹【2024年3月16日预测--第2套算法重新开始计算第2次测试】

今天继续开始咱们第2套算法的验证&#xff0c;计划每套算法连续测试10期&#xff0c;达到50%的命中率即为较优的模型&#xff0c;可继续使用。老规矩&#xff0c;先上图表&#xff0c;再下结论~ 最终&#xff0c;经过研判分析&#xff0c;2024年3月16日福彩3D的七码预测结果如下…

深度学习-基于机器学习的情绪分析研究

概要 互联网技术的迅速发展使得社交平台逐渐成为热点事件中社会情感的枢纽。社会热点事件的舆论监管的其中一个重要环节就是能够准确分析民众的社会情绪。本文旨在探索可以基于文本大数据彻底分析民众对热点事件的社会情绪的模型和方法。先是从社交平台上借助文本大数据、对数据…

SQL-Labs靶场“32-33”关通关教程

君衍. 一、32关 GET单引号闭合宽字节注入1、源码分析2、宽字节注入原理3、联合查询注入4、updatexml报错注入5、floor报错注入 二、33关 GET单引号addslashes逃逸注入1、源码分析2、联合查询注入3、updatexml报错注入4、floor报错注入 SQL-Labs靶场通关教程&#xff1a; SQL注入…

【Vite+Ts】自动按需引入Element-Plus

安装插件 cnpm i -D unplugin-vue-components unplugin-auto-import unplugin-element-plus修改vite.config.ts // vite.config.ts import AutoImport from "unplugin-auto-import/vite"; import Components from "unplugin-vue-components/vite"; impor…

SQLite数据库使用指南以及相关API编程

SQLite介绍 SQLite是一种基于C语言开发的轻量级、快速、自包含、高可靠性和全功能的SQL数据库引擎。它是全球范围内使用最为广泛的数据库引擎&#xff0c;被嵌入到所有移动设备和大部分计算机中&#xff0c;并且伴随着无数日常使用的应用程序一起提供。SQLite的文件格式具有稳…

html中如何让网页禁用右键禁止查看源代码

在网页中&#xff0c;辛辛苦苦写的文章&#xff0c;被别人复制粘贴给盗用去另很多站长感到非常无奈&#xff0c;通常大家复制都会使用选取右键复制&#xff0c;或CTRLC等方式&#xff0c;下面介绍几种禁止鼠标右键代码&#xff0c;可减少网页上文章被抄袭的几率&#xff0c;当然…

深入浅出理解 AI 生图模型

引言 众所周知&#xff0c;视频是图片连起来快速播放的&#xff0c;所以Stable Diffusion可能是sora参考的重要模型之一。 随着深度学习和生成模型的发展&#xff0c;扩散模型在生成领域也取得了显著进步。这类扩散模型通常分为扩散过程和逆扩散过程。 扩散过程是对数据&…

SPSS k-均值聚类的 anova分析表解读

from&#xff1a;SPSS K均值聚类&#xff08;k-means&#xff09;和可视化方法 - CollinsLi - 博客园 (cnblogs.com) F值&#xff1a;变量对聚类的贡献 显著性水平&#xff1a;<0.05 则因子显著

整数和浮点数在内存中是如何存储的?

1.整数在内存中的存储 首先数据在内存中都是以二进制的形式存储的&#xff0c;而整数在内存中也是以二进制的形式存储的&#xff0c;而整数的表示形式有三种&#xff0c;分别是源码&#xff0c;反码&#xff0c;补码&#xff0c;而整数在内存中是以补码的形式存放的。 三种表示…

SQLiteC/C++接口详细介绍之sqlite3类(十七)

返回目录&#xff1a;SQLite—免费开源数据库系列文章目录 上一篇&#xff1a;SQLiteC/C接口详细介绍之sqlite3类&#xff08;十六&#xff09; 下一篇&#xff1a; SQLiteC/C接口详细介绍之sqlite3类&#xff08;十八&#xff09; ​ 53.sqlite3_trace_v2 函数功能&#x…

element-plus怎么修改表单中的label字体颜色及大小

问题描述&#xff1a; 当我们在vue3中使用element-plus组件库提供的表单组件时&#xff0c;有时我们需要修改表单中label的字体颜色等属性&#xff0c;这是如果直接选中label的class进行修改是不起作用的&#xff0c;我们只需深度选择即可选中并进行修改。 比如&#xff1a; …

GET和POST方法的区别

GET和POST的区别 在我们开发项目的时候常常会在Controller层使用到POST方法或者GET方法&#xff0c;犹豫到底将接口定义为GET方法还是POST方法&#xff1f;那这两者之间有什么区别呢&#xff1f; 看一下官方定义&#xff1a; GET 和 POST 是 HTTP 协议中最常用的两种请求方法…

软考79-上午题-【面向对象技术3-设计模式】-结构型设计模式02

一、组合模式 1-1、意图 将对象组合成树型结构&#xff0c;以表示"部分-整体"的层次结构。Composite使得用户对单个对象和组 合对象的使用具有一致性。 示例&#xff1a;对象&#xff1a;文件、文件夹 1-2、结构 Component 为组合中的对象声明接口&#xff1b;在适…

MacBook使用——彻底卸载并删除软件:NTFS for Mac

问题 之前因MacBook读写NTFS格式移动硬盘&#xff0c;我安装并使用了 Paragon NTFS for Mac &#xff0c;试用期结束后将其从【应用程序】中卸载移除了。但之后每次开机启动时&#xff0c;系统还是会弹出【激活】通知&#xff0c;如下图 解决 Step1、在用户目录下的 Library 目…

Kubernetes 编排系统

Kubernetes 编排系统 Kubernetes&#xff08;简称K8s&#xff09;是一个开源的容器编排平台&#xff0c;用于自动化部署、扩展和管理容器化应用程序。它提供了一种灵活而强大的方式来管理容器化应用程序的生命周期&#xff0c;包括自动化部署、扩展、负载均衡、故障恢复等功能…

01初识Python

一、Python 简介 二、为什么要学Python? 三、Python 安装 四、输出第一条指令 五、总结 一、Python 简介 Python是一种高级编程语言,由Guido van Rossum于1991年创建。它具有简单易学的语法结构,被广泛应用于Web开发、数据科学、人工智能等领域。 Python具有丰富的库…