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

前端力扣刷题 | 6:hot100之 矩阵

73. 矩阵置零

给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。
在这里插入图片描述

法一:
var setZeroes = function(matrix) {let setX = new Set(); // 用于存储需要置零的行索引let setY = new Set(); // 用于存储需要置零的列索引let row = matrix.length;let col = matrix[0].length;for(let i=0;i<row;i++){for(let j=0;j<col;j++){if(matrix[i][j]===0){setX.add(i);setY.add(j);}}}// 将需要置零的行全置为 0for(let i of setX){for(let j=0;j<col;j++){matrix[i][j]=0;}}// 将需要置零的列全置为 0for(let i of setY){for(let j=0;j<row;j++){matrix[j][i]=0;}}
};
  • 时间复杂度:O(m*n)
  • 空间复杂度:O(m+n),额外使用了两个set来存储行和列索引
法二:
解题思路:
  1. 使用矩阵的第一行和第一列作为标记区域:
    • 用第一行标记需要置零的列。
    • 用第一列标记需要置零的行。
  2. 步骤概述:
    • 第一步:先遍历整个矩阵,记录哪些行和列需要置零(但不要急着修改矩阵)。
      • 使用第一行的元素记录某一列是否需要置零。
      • 使用第一列的元素记录某一行是否需要置零。
      • 此外,需要一个变量标记第一行和第一列本身是否需要置零。
    • 第二步:根据第一行和第一列的标记,修改矩阵对应的行和列为零。
    • 第三步:单独处理第一行和第一列(因为它们被用作标记,最后再更新)。
var setZeroes = function(matrix) {let row = matrix.length;let col = matrix[0].length;// 标记第一列和第一行是否需要置零let firstRowZero = false;let firstColZero = false;for (let i = 0; i < row; i++) {    // 检查第一列是否需要置零if (matrix[i][0] === 0) {firstColZero = true;break;}}for (let j = 0; j < col; j++) {    // 检查第一行是否需要置零if (matrix[0][j] === 0) {firstRowZero = true;break;}}for (let i = 1; i < row; i++) {    // 使用第一行和第一列标记需要置零的行和列for (let j = 1; j < col; j++) {if (matrix[i][j] === 0) {matrix[i][0] = 0; // 标记该行需要置零matrix[0][j] = 0; // 标记该列需要置零}}}for (let i = 1; i < row; i++) {    // 遍历矩阵,根据标记置零(跳过第一行和第一列)for (let j = 1; j < col; j++) {if (matrix[i][0] === 0 || matrix[0][j] === 0) {matrix[i][j] = 0;}}}if (firstColZero) {    // 根据标记处理第一列for (let i = 0; i < row; i++) {matrix[i][0] = 0;}}if (firstRowZero) {    // 根据标记处理第一行for (let j = 0; j < col; j++) {matrix[0][j] = 0;}}
};
  • 时间复杂度:O(m*n)
  • 空间复杂度:O(1),

54 螺旋矩阵

给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
在这里插入图片描述

思路:
  1. 定义边界:使用四个变量 top、bottom、left、right 分别表示矩阵的上、下、左、右边界。
  2. 遍历顺序:按照顺时针方向,依次遍历上边界、右边界、下边界和左边界。
  3. 调整边界:每遍历完一个边界后,调整相应的边界。
  4. 重复遍历:直到所有元素都被遍历。
代码实现:
var spiralOrder = function(matrix) {let res = [];// 维护四个边界let left = 0;let right = matrix[0].length-1;let top = 0;let bottom = matrix.length-1;// 遍历while(left<=right&&top<=bottom){for(let i=left;i<=right;i++){  // 遍历上边界res.push(matrix[top][i]);}top++;for(let i=top;i<=bottom;i++){  // 遍历右边界res.push(matrix[i][right]);}right--;if(top<=bottom){for(let i=right;i>=left;i--){  // 遍历下边界res.push(matrix[bottom][i]);}bottom--;}if(left<=right){for(let i=bottom;i>=top;i--){  // 遍历左边界res.push(matrix[i][left]);}left++;}}return res;
};

48. 旋转图像

给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。

你必须在原地旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。
在这里插入图片描述

思路:
  1. 转置矩阵:将矩阵的行和列互换(即 matrix[i][j] 和 matrix[j][i] 交换)。
  2. 翻转每一行:将转置后的矩阵的每一行反转。
代码实现:
var rotate = function(matrix) {for(let i=0;i<matrix.length;i++){for(let j=i;j<matrix.length;j++){[matrix[i][j],matrix[j][i]] = [matrix[j][i],matrix[i][j]];}}for(let i=0;i<matrix.length;i++){matrix[i].reverse();}
};

240. 搜索二维矩阵 II

编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:

  • 每行的元素从左到右升序排列。
  • 每列的元素从上到下升序排列。
    在这里插入图片描述
思路:从右上角或左下角开始搜索
  1. 从右上角开始:

    • 初始化指针在矩阵的右上角(即 row = 0,col = n - 1)。
    • 如果当前元素等于 target,返回 true。
    • 如果当前元素大于 target,说明目标值不可能在当前列,因此向左移动一列(col–)。
    • 如果当前元素小于 target,说明目标值不可能在当前行,因此向下移动一行(row++)。
    • 重复上述步骤,直到找到目标值或指针越界。
  2. 从左下角开始:

    • 初始化指针在矩阵的左下角(即 row = m - 1,col = 0)。
    • 如果当前元素等于 target,返回 true。
    • 如果当前元素大于 target,说明目标值不可能在当前行,因此向上移动一行(row–)。
    • 如果当前元素小于 target,说明目标值不可能在当前列,因此向右移动一列(col++)。
    • 重复上述步骤,直到找到目标值或指针越界。
代码实现(从右上角开始)
var searchMatrix = function(matrix, target) {if (matrix.length === 0 || matrix[0].length === 0) return false;let row = 0;let col = matrix[0].length-1;while(row<matrix.length && col>=0){if(matrix[row][col]===target){return true;}else if(matrix[row][col]>target){col--;}else{row++;}}return false;
};

相关文章:

前端力扣刷题 | 6:hot100之 矩阵

73. 矩阵置零 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 法一&#xff1a; var setZeroes function(matrix) {let setX new Set(); // 用于存储需要置零的行索引let setY new Set(); //…...

docker gitlab arm64 版本安装部署

前言&#xff1a; 使用RK3588 部署gitlab 平台作为个人或小型团队办公代码版本使用 1. docker 安装 sudo apt install docker* 2. 获取arm版本的gitlab GitHub - zengxs/gitlab-arm64: GitLab docker image (CE & EE) for arm64 git clone https://github.com/zengxs…...

路径规划之启发式算法之二十九:鸽群算法(Pigeon-inspired Optimization, PIO)

鸽群算法(Pigeon-inspired Optimization, PIO)是一种基于自然界中鸽子群体行为的智能优化算法,由Duan等人于2014年提出。该算法模拟了鸽子在飞行过程中利用地标、太阳和磁场等导航机制的行为,具有简单、高效和易于实现的特点,适用于解决连续优化问题。 更多的仿生群体算法…...

【AudioClassificationModelZoo-Pytorch】基于Pytorch的声音事件检测分类系统

源码&#xff1a;https://github.com/Shybert-AI/AudioClassificationModelZoo-Pytorch 模型测试表 模型网络结构batch_sizeFLOPs(G)Params(M)特征提取方式数据集类别数量模型验证集性能EcapaTdnn1280.486.1melUrbanSound8K10accuracy0.974, precision0.972 recall0.967, F1-s…...

一文讲解Java中的ArrayList和LinkedList

ArrayList和LinkedList有什么区别&#xff1f; ArrayList 是基于数组实现的&#xff0c;LinkedList 是基于链表实现的。 二者用途有什么不同&#xff1f; 多数情况下&#xff0c;ArrayList更利于查找&#xff0c;LinkedList更利于增删 由于 ArrayList 是基于数组实现的&#…...

CNN的各种知识点(五):平均精度均值(mean Average Precision, mAP)

平均精度均值&#xff08;mean Average Precision, mAP&#xff09; 1. 平均精度均值&#xff08;mean Average Precision, mAP&#xff09;概念&#xff1a;计算步骤&#xff1a;具体例子&#xff1a;重要说明&#xff1a;典型值范围&#xff1a; 总结&#xff1a; 1. 平均精度…...

【优先算法】专题——前缀和

目录 一、【模版】前缀和 参考代码&#xff1a; 二、【模版】 二维前缀和 参考代码&#xff1a; 三、寻找数组的中心下标 参考代码&#xff1a; 四、除自身以外数组的乘积 参考代码&#xff1a; 五、和为K的子数组 参考代码&#xff1a; 六、和可被K整除的子数组 参…...

gitea - fatal: Authentication failed

文章目录 gitea - fatal: Authentication failed概述run_gitea_on_my_pkm.bat 笔记删除windows凭证管理器中对应的url认证凭证启动gitea服务端的命令行正常用 TortoiseGit 提交代码备注END gitea - fatal: Authentication failed 概述 本地的git归档服务端使用gitea. 原来的用…...

基于Spring Security 6的OAuth2 系列之八 - 授权服务器--Spring Authrization Server的基本原理

之所以想写这一系列&#xff0c;是因为之前工作过程中使用Spring Security OAuth2搭建了网关和授权服务器&#xff0c;但当时基于spring-boot 2.3.x&#xff0c;其默认的Spring Security是5.3.x。之后新项目升级到了spring-boot 3.3.0&#xff0c;结果一看Spring Security也升级…...

蓝桥与力扣刷题(234 回文链表)

题目&#xff1a;给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为回文链表。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,2,1] 输出&#xff1a;true示例 2&#xff1a; 输入&…...

Google C++ Style / 谷歌C++开源风格

文章目录 前言1. 头文件1.1 自给自足的头文件1.2 #define 防护符1.3 导入你的依赖1.4 前向声明1.5 内联函数1.6 #include 的路径及顺序 2. 作用域2.1 命名空间2.2 内部链接2.3 非成员函数、静态成员函数和全局函数2.4 局部变量2.5 静态和全局变量2.6 thread_local 变量 3. 类3.…...

Windows图形界面(GUI)-QT-C/C++ - QT Tab Widget

公开视频 -> 链接点击跳转公开课程博客首页 -> ​​​链接点击跳转博客主页 目录 一、概述 1.1 什么是 QTabWidget&#xff1f; 1.2 使用场景 二、常见样式 2.1 选项卡式界面 2.2 动态添加和删除选项卡 2.3 自定义选项卡标题和图标 三、属性设置 3.1 添加页面&…...

【大数据技术】教程05:本机DataGrip远程连接虚拟机MySQL/Hive

本机DataGrip远程连接虚拟机MySQL/Hive datagrip-2024.3.4VMware Workstation Pro 16CentOS-Stream-10-latest-x86_64-dvd1.iso写在前面 本文主要介绍如何使用本机的DataGrip连接虚拟机的MySQL数据库和Hive数据库,提高编程效率。 安装DataGrip 请按照以下步骤安装DataGrip软…...

C++:结构体和类

在之前的博客中已经讲过了C语言中的结构体概念了&#xff0c;重复的内容在这儿就不赘述了。C中的结构体在C语言的基础上还有些补充&#xff0c;在这里说明一下&#xff0c;顺便简单地讲一下类的概念。 一、成员函数 结构体类型声明的关键字是 struct &#xff0c;在C中结构体…...

MATLAB的数据类型和各类数据类型转化示例

一、MATLAB的数据类型 在MATLAB中 &#xff0c;数据类型是非常重要的概念&#xff0c;因为它们决定了如何存储和操作数据。MATLAB支持数值型、字符型、字符串型、逻辑型、结构体、单元数组、数组和矩阵等多种数据类型。MATLAB 是一种动态类型语言&#xff0c;这意味着变量的数…...

UE求职Demo开发日志#19 给物品找图标,实现装备增加属性,背包栏UI显示装备

1 将用到的图标找好&#xff0c;放一起 DataTable里对应好图标 测试一下能正确获取&#xff1a; 2 装备增强属性思路 给FMyItemInfo添加一个枚举变量记录类型&#xff08;物品&#xff0c;道具&#xff0c;装备&#xff0c;饰品&#xff0c;武器&#xff09;--> 扩展DataT…...

C++泛型编程指南09 类模板实现和使用友元

文章目录 第2章 类模板 Stack 的实现2.1 类模板 Stack 的实现 (Implementation of Class Template Stack)2.1.1 声明类模板 (Declaration of Class Templates)2.1.2 成员函数实现 (Implementation of Member Functions) 2.2 使用类模板 Stack脚注改进后的叙述总结脚注2.3 类模板…...

使用MATLAB进行雷达数据采集可视化

本文使用轮趣科技N10雷达&#xff0c;需要源码可在后台私信或者资源自取 1. 项目概述 本项目旨在通过 MATLAB 读取 N10 激光雷达 的数据&#xff0c;并进行 实时 3D 点云可视化。数据通过 串口 传输&#xff0c;并经过解析后转换为 三维坐标点&#xff0c;最终使用 pcplayer 进…...

【Elasticsearch】allow_no_indices

- **allow_no_indices 参数的作用**&#xff1a; 该参数用于控制当请求的目标索引&#xff08;通过通配符、别名或 _all 指定&#xff09;不存在或已关闭时&#xff0c;Elasticsearch 的行为。 - **默认行为**&#xff1a; 如果未显式设置该参数&#xff0c;默认值为 …...

54【ip+端口+根目录通信】

上节课讲到&#xff0c;根目录起到定位作用&#xff0c;比如我们搭建一个php网站后&#xff0c;注册系统是由根目录的register.php文件执行&#xff0c;那么我们给这个根目录绑定域名https://127.0.0.1&#xff0c;当我们浏览器访问https://127.0.0.1/register.php时&#xff0…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 题目描述 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子&#xff0c;但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

C++.OpenGL (14/64)多光源(Multiple Lights)

多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

云原生安全实战:API网关Kong的鉴权与限流详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关&#xff08;API Gateway&#xff09; API网关是微服务架构中的核心组件&#xff0c;负责统一管理所有API的流量入口。它像一座…...

c++第七天 继承与派生2

这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分&#xff1a;派生类构造函数与析构函数 当创建一个派生类对象时&#xff0c;基类成员是如何初始化的&#xff1f; 1.当派生类对象创建的时候&#xff0c;基类成员的初始化顺序 …...