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

前端力扣刷题 | 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;
};

http://www.kler.cn/a/530816.html

相关文章:

  • 鲸鱼算法 matlab pso
  • 2025/2/3 云服务器数据库与idea相连
  • 【腾讯前端面试】纯css画图形
  • Error: Expected a mutable image
  • 知识库建设与知识管理实践对企业发展的助推作用探索
  • 在CentOS服务器上部署DeepSeek R1
  • linux下ollama更换模型路径
  • 【腾讯前端面试】纯css画图形
  • WebSocket 实时通信详解:原理、应用与实践
  • 即梦(Dreamina)技术浅析(四):生成对抗网络
  • Vue指令v-html
  • Windows程序设计12:获取磁盘分区信息
  • STM32_SD卡的SDIO通信_DMA读写
  • C语言基础系列【1】第一个C程序:Hello, World!
  • AI时代IT行业职业方向规划大纲
  • java异常处理——try catch finally
  • OpenAI 实战进阶教程 - 第六节: OpenAI 与爬虫集成实现任务自动化
  • UE Bridge混合材质工具
  • Bili23-Downloader 新春版,支持自动高音画质
  • 基于SpringBoot的中医经方药食两用服务平台的设计与实现(源码+SQL脚本+LW+部署讲解等)
  • 数据结构课程设计(四)校园导航
  • 【开源免费】基于Vue和SpringBoot的工作流程管理系统(附论文)
  • 影响ISIS邻居建立的因素
  • Kubernetes核心组件详解:从原理到实践
  • 机器学习--1.KNN机器学习入门
  • 什么是LPU?会打破全球算力市场格局吗?