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://www.hqwc.cn/news/544751.html

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

相关文章

网络安全等级测评师考试培训可以参考哪些资料?

网络安全是国家安全的重要组成部分&#xff0c;也是企业安全的重中之重&#xff1b;而网络安全等级测评师则是守护这一安全领域的重要力量。所以专业的网络安全等级测评师是非常重要。作为专业的网络安全等保测评师&#xff0c;他们肩负着对信息系统进行安全评估、发现潜在风险…

【01】htmlcssgit

01-前端干货-html&css 防脱发神器 一图胜千言 使用border-box控制尺寸更加直观,因此,很多网站都会加入下面的代码 * {margin: 0;padding: 0;box-sizing: border-box; }颜色的 alpha 通道 颜色的 alpha 通道标识了色彩的透明度,它是一个 0~1 之间的取值,0 标识完全…

Github Copilot 工具,无需账号,一键激活

① 无需账号&#xff0c;100%认证成功&#xff01;0风险&#xff0c;可联网可更新&#xff0c;&#xff0c;支持copilot版本升级&#xff0c;支持chat ② 支持windows、mac、linux系统等设备 ③一号通用&#xff0c;支持所有IDE(AppCode,CLion,DataGrip,GoLand,IntelliJ IDEA …

校园闲置物品交易网站 |基于springboot框架+ Mysql+Java+Tomcat的校园闲置物品交易网站设计与实现(可运行源码+设计文档)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 前台功能效果图 用户功能模块 管理员功能登录前台功能效果图 系统功能设计 数据库E-R图设计 lunwen…

EXCEL+PYTHON学习3

1&#xff09; 遍历一个SHEET&#xff0c;无非就是两个循环&#xff0c;rows属性是取得所有行。 fn data3_16.xlsx wb openpyxl.load_workbook(fn) ws wb.active for row in ws.rows:for cell in row:print(cell.value, end )print() 2&#xff09; 返回工作表的最小行数…

【C语言】函数栈帧---函数的创建于销毁过程剖析(一览无遗)

目录 前言&#xff1a; 1.铺垫 寄存器 main函数被谁调用 2.正题 结论&#xff1a; 前言&#xff1a; 学习这么久以来&#xff0c;可能有很多疑问&#xff1a;局部变量怎么创建的&#xff1f;为什么局部变量的值是随机的&#xff1f;函数是怎么传参的&#xff1f;传参的顺…

2024最新手赚手机软件APP下载排行网站源码及应用商店源码

这是一款简洁蓝色的手机软件下载应用排行、平台和最新发布网站&#xff0c;采用响应式织梦模板。主要包括主页、APP列表页、APP详情介绍页、新闻资讯列表、新闻详情页、关于我们等模块页面。 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/88898956 更…

java serlvet 高校学生画像平台系统Myeclipse开发mysql数据库web结构java编程计算机网页项目echarts图形展现

一、源码特点 java serlvet 高校学生画像平台系统是一套完善的java web信息管理系统 系统采用serlvetdaobean 模式开发本系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCA…

yocto 集成ros2(基于raspberrypi 4B)

yocto 集成ros2 上一小节已经使用yocto编译出了raspberrypi 4B的image。并且成功刷机并且启动登陆&#xff1a; 链接: yocto 编译raspberrypi 4B并启动 本节我们将ros2机器人操作系统移植到我们的yocto系统里面。 1. 下载ros layer 上小节我们编译的yocto image是基于kirkst…

HarmonyOS(二十)——管理应用拥有的状态之LocalStorage(页面级UI状态存储)

LocalStorage是页面级的UI状态存储&#xff0c;通过Entry装饰器接收的参数可以在页面内共享同一个LocalStorage实例。LocalStorage也可以在UIAbility实例内&#xff0c;在页面间共享状态。 本文仅介绍LocalStorage使用场景和相关的装饰器&#xff1a;LocalStorageProp和LocalS…

智慧城市革命,物联网技术如何改变城市治理与生活方式

随着科技的不断进步&#xff0c;智慧城市已经成为现代城市发展的重要方向之一。物联网技术作为智慧城市的重要支撑&#xff0c;正深刻改变着城市的治理模式和居民的生活方式。本文将探讨智慧城市革命&#xff0c;以及物联网技术如何改变城市治理与生活方式&#xff0c;同时介绍…

贪心算法(两个实例)

例一&#xff1a;调度问题 问题&#xff1a;由n项任务&#xff0c;每项任务的加工时间已知&#xff0c;从零时刻开始陆续加入一台机器上去加工&#xff0c;每个任务完成的时间是从0时刻到任务加工截至的时间。 求总完成时间&#xff08;所有任务完成时间最短计划方案&#xf…