• [leetcode]73. Set Matrix Zeroes矩阵置0


    Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in-place.

    Example 1:

    Input: 
    [
      [1,1,1],
      [1,0,1],
      [1,1,1]
    ]
    Output: 
    [
      [1,0,1],
      [0,0,0],
      [1,0,1]
    ]

    Example 2:

    Input: 
    [
      [0,1,2,0],
      [3,4,5,2],
      [1,3,1,5]
    ]
    Output: 
    [
      [0,0,0,0],
      [0,4,5,0],
      [0,3,1,0]
    ]

    题意

    给定一个矩阵,只要某个元素为0,就把对应的整行整列都置0。

    思路:

    题目要求O(1) space, 复用第一行第一列作参照。

    若input matrix是:

    1.  先扫第一行,将有0的位置做标记; 再扫第一列,将有0的位置做标记

      

    2. 将第一行第一列作参照,处理matrix剩余部分:扫matrix[i][j], 若为0,则反向去第一行第一列fill 0(做标记)

          

    3. 再扫matrix[i][j], 若之前对应的第一行第一列有fill 0的标记,则 fill myself as 0 

         

           

    4. 最后处理参照物第一行第一列自己

     

    代码

     1 class Solution {
     2     public void setZeroes(int[][] matrix) {
     3         final int rowLen = matrix.length;
     4         final int colLen = matrix[0].length;
     5         boolean row_has_zero = false; // 第一行是否存在 0
     6         boolean col_has_zero = false; // 第一列是否存在 0
     7 
     8         for (int j = 0; j < colLen; j++){
     9             if (matrix[0][j] == 0) {
    10                 row_has_zero = true;
    11                 break;
    12             }
    13         }
    14 
    15         for (int i = 0; i < rowLen; i++){
    16             if (matrix[i][0] == 0) {
    17                 col_has_zero = true;
    18                 break;
    19             }
    20         }
    21 
    22         for (int i = 1; i < rowLen; i++){
    23             for (int j = 1; j < colLen; j++){
    24                 if (matrix[i][j] == 0) {
    25                     matrix[0][j] = 0;
    26                     matrix[i][0] = 0;
    27                 }
    28             }
    29         }
    30 
    31         for (int i = 1; i < rowLen; i++){
    32             for (int j = 1; j < colLen; j++){
    33                 if (matrix[i][0] == 0 || matrix[0][j] == 0){matrix[i][j] = 0;}
    34             }
    35         }
    36         //不能先fill第一行和第一列,因为把第一行第一列当成了参照
    37         if (row_has_zero){
    38             for (int j = 0; j < colLen; j++){
    39                 matrix[0][j] = 0;
    40             }
    41         }
    42         if (col_has_zero){
    43             for (int i = 0; i < rowLen; i++){
    44                 matrix[i][0] = 0;
    45             }
    46         }
    47     }
    48 }
  • 相关阅读:
    19-background
    18-超链接导航栏案例
    17-文本属性和字体属性
    16-margin的用法
    15-浮动
    14-块级元素和行内元素
    13-标准文档流
    12-简单认识下margin
    11-border(边框)
    10-padding(内边距)
  • 原文地址:https://www.cnblogs.com/liuliu5151/p/10953109.html
Copyright © 2020-2023  润新知