zoukankan      html  css  js  c++  java
  • 73. Set Matrix Zeroes

    一、题目

      1、审题

      

      2、分析

        给出一个 mXn 二维矩阵,若 [i][j] 值为 0, 则矩阵第 i 行,第 j 列化为 0。

    二、解答

      1、思路:

        方法一、

          矩阵行长为 m,列长为 n,新建两个大小为 m、n的一维数组,用于记录该行、列是否为 0,最终,遍历数组给矩阵赋值即可。

          使用额外空间 O(m+n)

    public void setZeroes(int[][] matrix) {
        
            int m = matrix.length;
            int n = matrix[0].length;
            
            int[] rowArr = new int[m];
            int[] columnArr = new int[n];
            for (int i = 0; i < m; i++){ 
                for (int j = 0; j < n; j++) 
                    if(matrix[i][j] == 0) {
                        rowArr[i] = 1;
                        columnArr[j] = 1;
                    }
            }
            // 行化为 0
            for (int i = 0; i < m; i++) {
                if(rowArr[i] == 1) {
                    for (int j = 0; j < n; j++) {
                        matrix[i][j] = 0; 
                    }
                }
            }
            
            // 列化为 0
            for (int i = 0; i < n; i++) {
                if(columnArr[i] == 1) {
                    for (int j = 0; j < m; j++) {
                        matrix[j][i] = 0; 
                    }
                }
            }
        }

      方法二、

        将矩阵的第一行、第一列用作标记项;若 [i][j] 出现元素值为 0, 则 [i][0] 赋值 0,[0][j] 赋值为 0;

        由于遍历矩阵时,[0][0] 用于标记第一行是否为 0,故第一列是否为 0 需要另外申请一个变量 col0 记录;

        使用存储空间为 O(1)

    public void setZeroes2(int[][] matrix) {
            
            int rows = matrix.length;
            int columns = matrix[0].length;
            int col0 = 1;
            
            for (int i = 0; i < rows; i++) {
                if(matrix[i][0] == 0)
                    col0 = 0; // 标记第一列是否为 0
                // 第一行、第一列用于作标记
                for (int j = 1; j < columns; j++) {
                    if(matrix[i][j] == 0){
                        matrix[i][0] = 0;
                        matrix[0][j] = 0; 
                    }
                        
                }
            }
            
            
            for (int i = rows - 1; i >= 0; i--) {
                for(int j = columns - 1; j >= 1; j--)
                    if(matrix[i][0] == 0 || matrix[0][j] == 0)
                        matrix[i][j] = 0;
                
                if(col0 == 0) matrix[i][0] = 0;
            }
        }
  • 相关阅读:
    Linux下hook指定库
    一行一行往上爬
    高可用数据同步方案-SqlServer迁移Mysql实战
    Hystrix核心基础
    Fastjson解析多级泛型的几种方式—使用class文件来解析多级泛型
    面试大全之JVM篇
    云原生下的CICD
    学习Raft算法的笔记
    Go语言下的线程模型
    分布式事务解决方案以及 .Net Core 下的实现(上)
  • 原文地址:https://www.cnblogs.com/skillking/p/9687730.html
Copyright © 2011-2022 走看看