前端力扣刷题 | 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);
            }
        }
    }
    // 将需要置零的行全置为 0
    for(let i of setX){
        for(let j=0;j<col;j++){
            matrix[i][j]=0;
        }
    }
    // 将需要置零的列全置为 0
    for(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;
};

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SLAM技术栈 ——《视觉SLAM十四讲》学习笔记(一)

《视觉SLAM十四讲》学习笔记&#xff08;一&#xff09; 第2讲 初识SLAM习题部分 第3讲 三维空间刚体运动3.1 左手系与右手系3.2 齐次坐标3.3 旋转矩阵与变换矩阵3.4 正交群与欧式群3.5 旋转向量与欧拉角3.6 实践Eigen线性代数库3.6.1 QR分解(QR decomposition) 3.7 四元数到其…

自动驾驶---两轮自行车的自主导航

1 背景 无人驾驶汽车最早出现在DARPA的比赛中&#xff0c;从那个时刻开始&#xff0c;逐渐引起全球学者的注意&#xff0c;于是从上个世纪开始各大高校院所开始了无人汽车的研发。直到这两年&#xff0c;无人驾驶汽车才开始走进寻常百姓家&#xff0c;虽然目前市面上的乘用车还…

Spring Boot 2 快速教程:WebFlux处理流程(五)

WebFlux请求处理流程 下面是spring mvc的请求处理流程 具体步骤&#xff1a; 第一步&#xff1a;发起请求到前端控制器(DispatcherServlet) 第二步&#xff1a;前端控制器请求HandlerMapping查找 Handler &#xff08;可以根据xml配置、注解进行查找&#xff09; 匹配条件包括…

优选算法的灵动之章:双指针专题(一)

个人主页&#xff1a;手握风云 专栏&#xff1a;算法 一、双指针算法思想 双指针算法主要用于处理数组、链表等线性数据结构中的问题。它通过设置两个指针&#xff0c;在数据结构上进行遍历和操作&#xff0c;从而实现高效解决问题。 二、算法题精讲 2.1. 查找总价格为目标值…

Intel 与 Yocto 项目的深度融合:全面解析与平台对比

在嵌入式 Linux 领域&#xff0c;Yocto 项目已成为构建定制化 Linux 发行版的事实标准&#xff0c;广泛应用于不同架构的 SoC 平台。Intel 作为 x86 架构的领导者&#xff0c;在 Yocto 生态中投入了大量资源&#xff0c;为其嵌入式处理器、FPGA 和 AI 加速硬件提供了完整的支持…

算法刷题Day29:BM67 不同路径的数目(一)

题目链接 描述 解题思路&#xff1a; 二维dp数组初始化。 dp[i][0] 1, dp[0][j] 1 。因为到达第一行第一列的每个格子只能有一条路。状态转移 dp[i][j] dp[i-1][j] dp[i][j-1] 代码&#xff1a; class Solution: def uniquePaths(self , m: int, n: int) -> int: #…

98,【6】 buuctf web [ISITDTU 2019]EasyPHP

进入靶场 代码 <?php // 高亮显示当前 PHP 文件的源代码&#xff0c;通常用于调试或展示代码&#xff0c;方便用户查看代码逻辑 highlight_file(__FILE__);// 从 GET 请求中获取名为 _ 的参数值&#xff0c;并赋值给变量 $_ // 符号用于抑制可能出现的错误信息&#xff…

C++中常用的十大排序方法之4——希尔排序

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【&#x1f60a;///计算机爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于C中常用的排序方法之4——希尔排序的相…

字节iOS面试经验分享:HTTP与网络编程

字节iOS面试经验分享&#xff1a;HTTP与网络编程 &#x1f31f; 嗨&#xff0c;我是LucianaiB&#xff01; &#x1f30d; 总有人间一两风&#xff0c;填我十万八千梦。 &#x1f680; 路漫漫其修远兮&#xff0c;吾将上下而求索。 目录 字节iOS面试经验分享&#xff1a;HTT…

音视频入门基础:RTP专题(7)——RTP协议简介

一、引言 本文对RTP协议进行简介。在简介之前&#xff0c;请各位先下载RTP的官方文档《RFC 3550》和《RFC 3551》。《RFC 3550》总共有89页&#xff0c;《RFC 3551》总共有44页。本文下面所说的“页数”是指在pdf阅读器中显示的页数&#xff1a; 二、RTP协议简介 根据《RFC 35…

SQLGlot:用SQLGlot解析SQL

几十年来&#xff0c;结构化查询语言&#xff08;SQL&#xff09;一直是与数据库交互的实际语言。在一段时间内&#xff0c;不同的数据库在支持通用SQL语法的同时演变出了不同的SQL风格&#xff0c;也就是方言。这可能是SQL被广泛采用和流行的原因之一。 SQL解析是解构SQL查询…

Java 大视界 -- Java 大数据在智能电网中的应用与发展趋势(71)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

想表示消息返回值为Customer集合

道奈特(240***10) 14:34:55 EA中序列图。我想表示消息返回值为 Customer 集合。目前只有一个Customer实体类&#xff0c;我需要另外新建一个CustomerList 类吗&#xff1f; 潘加宇(35***47) 17:01:26 不需要。如果是分析&#xff0c;在类的操作中&#xff0c;定义一个参数&…

01.双Android容器解决方案

目录 写在前面 一&#xff0c;容器 1.1 容器的原理 1.1.1 Namespace 1.1.2 Cgroups&#xff08;Control Groups&#xff09; 1.1.3 联合文件系统&#xff08;Union File System&#xff09; 1.2 容器的应用 1.2.1 微服务架构 1.2.2 持续集成和持续部署&#xff08;CI/…

【Elasticsearch】硬件资源优化

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

2025-工具集合整理

科技趋势 github-rank &#x1f577;️Github China/Global User Ranking, Global Warehouse Star Ranking (Github Action is automatically updated daily). 科技爱好者周刊 制图工具 D2 D2 A modern diagram scripting language that turns text to diagrams 文档帮助 …

二叉树--链式存储

1我们之前学了二叉树的顺序存储&#xff08;这种顺序存储的二叉树被称为堆&#xff09;&#xff0c;我们今天来学习一下二叉树的链式存储&#xff1a; 我们使用链表来表示一颗二叉树&#xff1a; ⽤链表来表⽰⼀棵⼆叉树&#xff0c;即⽤链来指⽰元素的逻辑关系。通常的⽅法是…

Java 23新特性

文章目录 Java 23新特性一、引言二、Markdown文档注释&#xff08;JEP 467&#xff09;示例 三、ZGC&#xff1a;默认的分代模式&#xff08;JEP 474&#xff09;1. 为什么要引入分代模式2. 使用分代模式的优势3. 如何启用分代模式 四、隐式声明的类和实例主方法&#xff08;JE…

【数据结构】_链表经典算法OJ:复杂链表的复制

目录 1. 题目链接及描述 2. 解题思路 3. 程序 1. 题目链接及描述 题目链接&#xff1a;138. 随机链表的复制 - 力扣&#xff08;LeetCode&#xff09; 题目描述&#xff1a; 给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;…

Shell篇-字符串处理

目录 1.变量引用 2.获取字符串长度 3.字符串截取 4.删除子字符串 5.字符串替换 总结&#xff1a; Bash&#xff08;Shell 脚本&#xff09;中的字符串处理语法。以下是对其的介绍和总结&#xff1a;Bash 变量可以使用不同的语法来获取、修改和删除字符串的内容。图片中列…