hot100 -- 矩阵

news2024/12/23 13:59:25

👂 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; // 防止下取整死循环, 要 +1
    if (...) 
        l = m; // 记住 l = m
    else 
        r = m - 1;
}

模板2 -- 整数二分

while (l < r) {
    int mid = (l + r) >> 1; 
    if (...)
        r = m; // 上面没 +1 就 r = m
    else
        l = 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 列记录该行 / 列是否包含 0
                if (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 行置 0
                for (int j = 0; j < n; ++j) 
                    matrix[i][j] = 0; 
        for (int j = 1; j < n; ++j) 
            if (matrix[0][j] == 0) // 第 j 列置 0
                for (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 == r
            if (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.coloradmin.cn/o/1521066.html

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

相关文章

AI成就画质冠军!海信电视U8N Pro的“硬参数”和“软实力”

不得不说&#xff0c;这几年AI落地大有摧枯拉朽之势&#xff0c;也离普通人的生活越来越近了。 如果说&#xff0c;曾经1997年“深蓝”计算机赢下国际象棋世界冠军&#xff0c;还没那么让人印象深刻&#xff0c;2016年Alpha Go战胜围棋世界冠军&#xff0c;即使广泛关注&#…

replace和replaceAll的区别

replace和replaceAll的区别 replaceAll有些浏览器不兼容,如下图所示 replace的使用1>若只替换一个字符串abc.replace(b,1)//a1cabcaaa.replace(a,1)//1bcaaa2>若替换所有字符串abcaaa.replace(/\a/g,1)//1bc111replaceAll的使用1>若只替换一个字符串abc.replace(b,…

AI智慧校园电子班牌云平台源码

目录 家长端 学校端 电子围栏 亲情通话 课堂答题 移动化管理模式 统一资源管理平台 模板内容智能更换 家校互联 家长端 多场景通话:上学放学联系、紧急遇险求助联系、日常亲情通话关注孩子人身安全:到校离校情况、进入危险区域预警等。 学校端 课堂秩序管理:提高教…

服务器数据恢复—服务器硬盘灯显示红色的数据恢复案例

服务器数据恢复环境&故障&#xff1a; 一台服务器中有一组由多块硬盘组建的raid阵列&#xff0c;在运行过程中服务器突然崩溃&#xff0c;管理员检查服务器发现该服务器raid阵列中有两块硬盘的指示灯显示红色。于是&#xff0c;管理员重启服务器&#xff0c;服务器重启后&a…

基于Python django的人脸识别门禁系统,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、Python技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&…

mac redis启动,redis哨兵模式,redis集群的相关命令

Homebrew安装的软件会默认在/usr/local/Cellar/路径下 redis的配置文件redis.conf存放在/usr/local/etc路径下 cd /usr/local/Cellar/redis/7.0.10. 存在 cd /usr/local/opt/redis/bin/redis-server. 目录存在 cd /usr/local/etc/redis.conf 存在。配置文件 复制文件 cp …

可视化展示与交互编辑:探索3D Web轻量化平台HOOPS WEB Platform在BIM中的新可能性

随着数字技术的飞速发展&#xff0c;建筑行业也在不断迈向数字化转型的道路。在这个过程中&#xff0c;BIM&#xff08;Building Information Modeling&#xff0c;建筑信息模型&#xff09;技术已经成为建筑设计、施工和管理领域中的一项重要工具。 而在BIM的应用中&#xff…

MATLAB中visdiff函数用法

目录 语法 说明 示例 比较两个文件 比较两个文件并指定类型 发布比较报告 visdiff函数的功能是比较两个文件或文件夹。 语法 visdiff(filename1,filename2) visdiff(filename1,filename2,type) comparison visdiff(___) 说明 visdiff(filename1,filename2) 打开比较工…

JVM理解学习

参考视频 运行时数据区 JVM架构总览图 绿色的&#xff1a;方法区&#xff0c;堆&#xff0c;是所有线程共享的 黄色的&#xff1a; 虚拟机栈&#xff0c;本地方法栈&#xff0c;程序计数器&#xff0c;是线程私有的 程序计数器 程序计数器是一块较小的内存空间&#xff0c;物…

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

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

力扣映射题:机器人能否返回原点

超时太多了&#xff0c;笔者也开始放弃遍历了 bool judgeCircle(char* moves) {int arr[4]{0};for(int x0;x<strlen(moves);x) {if(moves[x]R){arr[0]arr[0]1;}if(moves[x]L){arr[1]arr[1]1;}if(moves[x]U){arr[2]arr[2]1;}if(moves[x]D){arr[3]arr[3]1;}} if(arr[0]-arr[1…

php彩虹/异世界云商全解系统

系统更新与修复列表 1. 基于彩虹的二次开发 - 对彩虹系统进行了二次开发&#xff0c;增强了系统的功能和性能。2. 新增自定义输入框提示内容&#xff08;支持批量修改&#xff09; - 用户可以自定义输入框的提示内容&#xff0c;并支持批量修改&#xff0c;提升用户体验。3. 新…

掌握高级设计原则:Java中的过滤器模式解析与实战演练,构建灵活且可扩展的系统架构

过滤器模式是一种结构型设计模式&#xff0c;它允许开发者使用不同的标准来过滤一组对象&#xff0c;并通过逻辑运算以解耦的方式将它们联系起来。 过滤器模式的核心在于提供了一个处理对象的机制&#xff0c;这个机制可以根据一个或多个标准来决定哪些对象应该被接受、哪些应…

代码学习记录21--回溯算法第二天

随想录日记part21 t i m e &#xff1a; time&#xff1a; time&#xff1a; 2024.03.16 主要内容&#xff1a;今天主要是结合类型的题目加深对回溯算法的理解&#xff1a;1&#xff1a;组合总和&#xff1b;2&#xff1a;电话号码的字母组合 216.组合总和III17.电话号码的字母…

快速了解微软推出的开发人员主页的应用

一、概述 开发人员主页是微软推出的一个新的 Windows 控制中心&#xff0c;提供以下功能&#xff1a;使用可自定义小组件监视仪表板中的项目&#xff0c;通过下载应用、包或存储库来设置开发环境&#xff0c;连接到开发人员帐户和工具&#xff08;如 GitHub&#xff09;&#x…

【C++进阶】深度解析AVL树及其简单模拟实现

AVL树的解析和模拟实现 一&#xff0c;什么是AVL树二&#xff0c;AVL树的特性三&#xff0c;模拟实现1. 基本框架2. 插入&#xff08;不带旋转&#xff09;2. AVL树的旋转3. AVL树的验证 四&#xff0c;总结 一&#xff0c;什么是AVL树 之前我们学习了二叉搜索树&#xff0c;但…

【每日力扣】40.组合总和II与701. 二叉搜索树中的插入操作

&#x1f525; 个人主页: 黑洞晓威 &#x1f600;你不必等到非常厉害&#xff0c;才敢开始&#xff0c;你需要开始&#xff0c;才会变的非常厉害。 40.组合总和II 给定一个候选人编号的集合 candidates 和一个目标数 target &#xff0c;找出 candidates 中所有可以使数字和为…

【小白学机器学习8】统计里的自由度DF=degree of freedom, 以及关于df=n-k, df=n-k-1, df=n-1 等自由度公式

目录 1 自由度 /degree of freedom / df 1.1 物理学的自由度 1.2 数学里的自由度 1.2.1 数学里的自由度 1.2.2 用线性代数来理解自由度&#xff08;需要补充&#xff09; 1.2.3 统计里的自由度 1.3 统计学里自由度的定义 2 不同对象的自由度 2.1 纯公式的自由度&#…

报Invalid value type for attribute ‘factoryBeanObjectType‘: java.lang.String错误

在springboot中使用Mybatis出现Invalid value type for attribute factoryBeanObjectType: java.lang.String 1、没有使用mybatis 检查pom文件里面的mybatis 可能是缺少这个依赖&#xff0c;或者版本过低 重新导入依赖 <dependency><groupId>org.mybatis.spri…

华为数通方向HCIP-DataCom H12-821题库(多选题:141-160)

第141题 以下关于802.1X认证的触发机制,描述正确的有? A、802.1X认证不能由认证设备(如802.1交换机)发起 B、802.1X客户端可以组播或广播方式触发认证 C、认证设备可以以组播或单播方式触发认证 D、802.1X认证只能由客户端主动发起 【参考答案】BC 【答案解析】 第142题 以…