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

【力扣Hot 100】矩阵1

矩阵置零:1. 开两个数组判断该行/该列是否有0;2. 用第0行/第0列分别判断该列/该行是否有0

螺旋矩阵:记录方向,一直按某方向前进,遇到障碍方向就变一下

1. 矩阵置零

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

示例 1:

输入:matrix = [[1,1,1],[1,0,1],[1,1,1]]
输出:[[1,0,1],[0,0,0],[1,0,1]]

示例 2:

输入:matrix = [[0,1,2,0],[3,4,5,2],[1,3,1,5]]
输出:[[0,0,0,0],[0,4,5,0],[0,3,1,0]]

提示:

  • m == matrix.length
  • n == matrix[0].length
  • 1 <= m, n <= 200
  • 231 <= matrix[i][j] <= 231 - 1

题解

开两个数组row, col, 分别记录该行该列是否有0

class Solution {
public:
    void setZeroes(vector<vector<int>>& matrix) {
        int m = matrix.size(), n = matrix[0].size();
        vector<bool> row(m, false), col(n, false);
        for(int i = 0; i < m; i ++ ) {
            for(int j = 0; j < n; j ++ ) {
                if(!matrix[i][j]) {
                    row[i] = true;
                    col[j] = true;
                }
            }
        }

        for(int i = 0; i < m; i ++ ) {
            for(int j = 0; j < n; j ++ ) {
                if(row[i] || col[j]) {
                    matrix[i][j] = 0;
                }
            }
        }
    }
};

优化方法:用第0行第0列来表示该行/该列是否有0,对于第0行和第0列是否有0,单独用两个变量来记录。

class Solution {
public:
    void setZeroes(vector<vector<int>>& matrix) {
        int m = matrix.size(), n = matrix[0].size();
        bool row0 = false, col0 = false;

        // 记录第0列是否有0
        for(int i = 0; i < m; i ++ ) {
            if(!matrix[i][0]) {
                col0 = true;
                break;
            }
        }

        // 记录第0行是否有0
        for(int i = 0; i < n; i ++ ) {
            if(!matrix[0][i]) {
                row0 = true;
                break;
            }
        }

        // 遍历数组,如果是0,就把该行的第0位设为0,该列的第0位设为0
        for(int i = 1; i < m; i ++ ) {
            for(int j = 1; j < n; j ++ ) {
                if(!matrix[i][j]) {
                    matrix[i][0] = 0;
                    matrix[0][j] = 0;
                }
            }
        }

        for(int i = 1; i < m; i ++ ) {
            for(int j = 1; j < n; j ++ ) {
                if(!matrix[0][j] || !matrix[i][0]) {
                    matrix[i][j] = 0;
                }
            }
        }

        if(row0) {
            for(int i = 0; i < n; i ++ ) {
                matrix[0][i] = 0;
            }
        }

        if(col0) {
            for(int i = 0; i < m; i ++ ) {
                matrix[i][0] = 0;
            }
        }
    }
};

2. 螺旋矩阵

给你一个 mn 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。

示例 1:

输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]

示例 2:

输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]

提示:

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= m, n <= 10
  • 100 <= matrix[i][j] <= 100

题解

dx[4] = {0, 1, 0, -1}, dy[4] = {1, 0, -1, 0}

dir = 0;

从第0个方向开始,一直走到不能走的位置,再更换方向。

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        int m = matrix.size(), n = matrix[0].size();
        int dx[4] = {0, 1, 0, -1}, dy[4] = {1, 0, -1, 0};
        int dir = 0;
        vector<int> ans;
        vector<vector<bool>> vis(m, vector<bool>(n));
        int x = 0, y = 0;
        for(int i = 0; i < m * n; i ++ ) {
            ans.push_back(matrix[x][y]);
            vis[x][y] = true;
            int nx = x + dx[dir], ny = y + dy[dir];
            if(nx < 0 || nx >= m || ny < 0 || ny >= n || vis[nx][ny]) {
                dir = (dir + 1) % 4;
                nx = x + dx[dir];
                ny = y + dy[dir];
            }
            x = nx;
            y = ny;
        }
        return ans;
    }
};

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

相关文章:

  • Couchbase UI: Indexes
  • Semantic Kernel - Kernel理解
  • uva 1354 Mobile Computing
  • 国产编辑器EverEdit - 大纲视图
  • java后端之事务管理
  • Linux--权限
  • go replay流量重放[详细教程]
  • JS 正则表达式 -- 分组【详解】含普通分组、命名分组、反向引用
  • 豆包 MarsCode + 开源 = ?AI 助力开源社区新人成长
  • JVM学习指南(48)-JVM即时编译
  • 2025美赛数学建模ICM问题F:网络强大?(Problem F: Cyber Strong?)完整文章 模型 数据 源代码 结果分享
  • Jenkins下线实例报错
  • 罗永浩的“最后一次创业”:从AR到AI大模型的战略转型
  • Spring 源码学习(七)——注解后处理器-2
  • SpringBoot支持动态更新配置文件参数
  • 群辉部署集2 Neo4j
  • 一文了解神经网络和模型训练过程
  • java入门基础笔记语法篇(3)
  • 【Qt】05-菜单栏
  • 10. SpringCloud Alibaba Sentinel 规则持久化部署详细剖析
  • 深入详解监督学习之回归与分类算法的全景视图
  • Spring Boot整合JavaMail实现邮件发送
  • springboot基于Spring Boot的智慧养老服务系统的设计与实现
  • CentOS 上安装 Go (Golang)
  • 正则表达式中常见的贪婪词
  • Nginx入门学习