首页 > 其他分享 >73.矩阵置零

73.矩阵置零

时间:2024-08-21 16:54:19浏览次数:10  
标签:rows matrix int 矩阵 cols ++ boolean 73

1.题目描述

给定一个 m x n 的矩阵,如果一个元素为 ,则将其所在行和列的所有元素都设为 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

进阶:

  • 一个直观的解决方案是使用  O(mn) 的额外空间,但这并不是一个好的解决方案。
  • 一个简单的改进方案是使用 O(m + n) 的额外空间,但这仍然不是最好的解决方案。
  • 你能想出一个仅使用常量空间的解决方案吗?

2.解题思路

2.1空间复杂度O(m+n)

使用两个数组,rows用于记录该行是否包含0,cols用于记录该列是否包含0,一次遍历后,rows,cols中分别保存了所有含0的行和列的情况,然后再遍历矩阵,给rows[i] = true 或 cols[j] = true的位置赋0即可,这种方式使用了O(m+n)的空间复杂度,可以进一步优化

2.2空间复杂度O(1)

上述思路是借助两个数组统计的某一行某一列的含0情况,而为了不使用额外的空间,我们可以就在matrix数组的第0列,第0行的位置记录 从[1,m-1)行中为0的情况,和[1,n-1)列中为0的情况,就相当于把rows,cols两个数组转化成了matrix的第0列和第0行,但是这么做会使得原来第0行第0列的情况没办法被记录下来,因此就需要两个flag标记位,先对第0行第0列是否含0进行记录,然后其他的位置 如 matrix[i][j]如果为0,就将matrix[0][j] 和 matrix[i][0]置为0,后面遍历遇到这个位置为0时,要把相应行和列的位置上也都置为0

3.代码实现

3.1方法一

/**
     * 基于两个辅助数组rows cols,空间复杂度为O(m+n)
     * @param matrix
     */
    public void setZeroes(int[][] matrix) {
        //统计哪一行 哪一列需要置为0
        int m = matrix.length;
        int n = matrix[0].length;
        boolean[] rows = new boolean[m];
        boolean[] cols = new boolean[n];
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (matrix[i][j] == 0) {
                    rows[i] = true;
                    cols[j] = true;
                }
            }
        }
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                if (rows[i] || cols[j]) {
                    matrix[i][j] = 0;
                }
            }
        }
    }

3.2方法二

class Solution {
    public void setZeroes(int[][] matrix) {
        int m = matrix.length;
        int n = matrix[0].length;
        //flag1,flag2分别用于统计第0行,第0列是否含有0
        boolean flag1 = false;
        boolean flag2 = false;
        for (int j = 0; j < n; j++) {
            if (matrix[0][j] == 0) {
                flag1 = true;
            }
        }
        for (int i = 0; i < m; i++) {
            if (matrix[i][0] == 0) {
                flag2 = true;
            }
        }
        
        //将第0行 和 第0列当作方法一中的rows 和 cols 辅助数组
        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                if (matrix[i][j] == 0) {
                    matrix[i][0] = 0;
                    matrix[0][j] = 0;
                }
            }
        }
        //根据辅助数组中的值,给需要修改的地方赋值为0
        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                if (matrix[i][0] == 0 || matrix[0][j] == 0) {
                    matrix[i][j] = 0;
                }
            }
        }
        //根据flag1,flag2的值,分别给第0行第0列赋0
        if (flag1) {
            for (int j = 0; j < n; j++) {
                matrix[0][j] = 0;
            }
        }
        if (flag2) {
            for (int i = 0; i < m; i++) {
                matrix[i][0] = 0;
            }
        }
    }
}

标签:rows,matrix,int,矩阵,cols,++,boolean,73
From: https://blog.csdn.net/cqjnovo/article/details/141397654

相关文章

  • 找矩阵
    通过矩阵转置,归并行、列两种情况先行后列表示坐标点击查看代码#include<bits/stdc++.h>usingnamespacestd;charc[3005][3005];ints[3005][3005],u,v,n,m,l[3005],r[3005];boolf;intcalc(intx1,inty1,intx2,inty2){returns[x2][y2]-s[x1-1][y2]-s[x2......
  • 不同矩阵变换的特征值和特征向量对比,简洁明了的大表格!
    为了方便自己,也为了方便大家总结如图,毫无废话,原矩阵为A矩阵特征值特征向量----如有错误还请告知,觉得很对欢迎点赞!......
  • 力扣热题100_二分查找_74_搜索二维矩阵
    文章目录题目链接解题思路解题代码题目链接74.搜索二维矩阵给你一个满足下述两条属性的mxn整数矩阵:每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。给你一个整数target,如果target在矩阵中,返回true;否则,返回fa......
  • Leetcode 59.螺旋矩阵II
    力扣题目链接(opensnewwindow)**给定一个正整数n,生成一个包含1到n^2所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。示例:输入:3输出:[[1,2,3],[8,9,4],[7,6,5]]思路这道题目可以说在面试中出现频率较高的题目,本题并不涉及到什么算法,就是......
  • 抖音企业员工矩阵号 - 评论和私信统一接待回复
    假如做抖音矩阵账号,有几十上百的账号想要统一接待回复私信和评论https://gofly.v1kf.com 基于抖音开放平台官方接口,授权接入有两种方式:登录注册页面,直接抖音扫码登入后台前往【菜单】【团队设置】【抖音接入】【扫码授权】,这个地方可以在一个客服账号下绑定多个抖音,方便......
  • 10倍加速LLM计算效率:消失的矩阵乘
    矩阵乘法(MatMul)是深度学习中的主要计算瓶颈,尤其在ChatGPT等Transformer模型中,矩阵乘法的运行时长约占其总运行时长的45-60%,解决这一挑战对发展更经济的大模型具有重要意义。为此,加州大学的研究人员在论文《ScalableMatMul-freeLanguageModeling(可扩展的无矩阵乘法语言模......
  • 小红书实战宝典:解锁爆款密码,从矩阵号到高效投放
    关键词:小红书营销,矩阵号策略,内容创造,数据分析目录:品牌矩阵号构建与管理视频教程:《商家矩阵号打法》产品形象塑造视频教程:《产品塑造》高质量内容生产视频教程:《内容制造》图文笔记发布技巧视频教程:《如何发图文笔记》短视频内容创作与优化视频教程:《短视频》......
  • 动态dp & 矩阵加速递推
    广义矩阵乘法我们定义两个矩阵\(A,B\)在广义矩阵乘法下的乘积为\(C\),其中\[C=\begin{bmatrix}\max\limits_{i=1}\limits^{m}A_{1,i}+B_{i,1}&\max\limits_{i=1}\limits^{m}A_{1,i}+B_{i,2}&\dots&\max\limits_{i=1}\limits^{m}A_{1,i}+B_{i,k}\\\......
  • 03-Matlab数组与矩阵
    数组的建立和操作数组算术运算数组信息获取矩阵的建立矩阵的扩展矩阵的块操作矩阵中元素的删除赋值为一对方括号矩阵的转置加点不转置为共轭复数没点的转置为共轭复数矩阵的旋转矩阵的翻转矩阵尺寸的改变矩阵加减法矩阵乘法矩阵除法矩阵中元素......
  • 洛谷 P5731 蛇形方阵
    目录题目-蛇形方阵题目描述输入格式输出格式样例样例输入#1样例输出#1提示ACCODE思路ACCODE题目-蛇形方阵题目描述给出一个不大于9的正整数n,输出n×n的蛇形方阵。从左上角填上1开始,顺时针方向依次填入数字,如同样例所示。注意每个数字有都会占用3个字符,前面......