• 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;
            }
        }
  • 相关阅读:
    Shiro安全框架之集成 Web(下)
    Shiro安全框架之集成 Web(中)
    Shiro安全框架之集成 Web(上)
    01背包
    巴什博弈
    斐波那契博弈
    一. 至少转最多
    平面分割类问题
    求凸包(安德鲁算法)
    GCD和exGCD
  • 原文地址:https://www.cnblogs.com/skillking/p/9687730.html
Copyright © 2020-2023  润新知