zoukankan      html  css  js  c++  java
  • LeetCode 73. Set Matrix Zeros(矩阵赋零)

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

    click to show follow up.

    Follow up:

    Did you use extra space?
    A straight forward solution using O(mn) space is probably a bad idea.
    A simple improvement uses O(m + n) space, but still not the best solution.
    Could you devise a constant space solution?


    题目标签:Array
      这道题目给了我们一个矩阵,让我们把所有是0的位置的那一行和那一列都改成0。我们自己改成0的位置就不需要再改0了。题目还要求我们用 O(1) space,所以就不能另外新建matrix来辅助了。这道题目的难点在于,如果遇到一个0,把它的那一行和那一列都改成0的话,对之后的遍历其他位置的判断就造成了影响。我们可以把这 (遇到0就改这一行和这一列)步骤分解成4个步骤。利用第一行和第一列来存信息,根据信息来对剩下的所有位置改0。那么我们首先要把第一行和第一列里有没有0的这个信息保存起来。
      Step 1: 遍历第一行和第一列,设置两个boolean 来保存,如果有0就是true;
      Step 2: 遍历剩下的行和列,如果遇到0,就把对应在第一行和第一列里的相对位置改成0;
      Step 3: 和step 2一样,遍历除了第一行和第一列的所有位置,对于每一个位置,如果第一行和第一列里的相对位置是0的话,把这个位置改成0;
      Step 4: 最后把第一行和第一列也改0,根据开始存的两个boolean 值。
     
     
     

    Java Solution:

    Runtime beats 23.97% 

    完成日期:07/23/2017

    关键词:Array

    关键点:把原题给的十字改0的这一个过程分解成四个步骤来实现

     1 public class Solution 
     2 {
     3     public void setZeroes(int[][] matrix) 
     4     {
     5         boolean firstRow = false;
     6         boolean firstCol = false;
     7         
     8         // iterate the first row and column to see any zeros there
     9         for(int y=0; y<matrix[0].length; y++)
    10         {
    11             if(matrix[0][y] == 0)
    12             {
    13                 firstRow = true;
    14                 break;
    15             }
    16         }
    17         
    18         for(int x=0; x<matrix.length; x++)
    19         {
    20             if(matrix[x][0] == 0)
    21             {
    22                 firstCol = true;
    23                 break;
    24             }
    25         }
    26         
    27         // iterate rest rows and columns, 
    28         //if see any zero, put zero in corresponding position in first row and first column
    29         for(int x=1; x<matrix.length; x++) // rows
    30         {
    31             for(int y=1; y<matrix[0].length; y++) // columns
    32             {
    33                 if(matrix[x][y] == 0)
    34                 {
    35                     matrix[x][0] = 0;
    36                     matrix[0][y] = 0;
    37                 }
    38             }
    39         }
    40         
    41         // iterate rest rows and columns again, 
    42         // for each position, if corresponding first row or first column has 0, change this to 0
    43         for(int x=1; x<matrix.length; x++)
    44         {
    45             for(int y=1; y<matrix[0].length; y++)
    46             {
    47                 if(matrix[x][0] == 0 || matrix[0][y] == 0)
    48                     matrix[x][y] = 0;
    49             }
    50         }
    51         
    52         
    53         // check two boolean firstRow and firstCol, and decide need to make first row and first column to 0
    54         if(firstRow)
    55             for(int y=0; y<matrix[0].length; y++)
    56                 matrix[0][y] = 0;
    57         
    58         if(firstCol)
    59             for(int x=0; x<matrix.length; x++)
    60                 matrix[x][0] = 0;
    61     }
    62 }

    参考资料:

    http://www.cnblogs.com/grandyang/p/4341590.html

    LeetCode 算法题目列表 - LeetCode Algorithms Questions List

  • 相关阅读:
    再叙存储设备
    分布式文件系统---测试
    分布式文件系统
    Solr 分布式(复制)配置--成功验证
    搜索服务之离线处理思路
    我为公司做的总体架构,欢迎提建议
    python的面向对象
    python异常处理
    迭代器和生成器
    python函数
  • 原文地址:https://www.cnblogs.com/jimmycheng/p/7226893.html
Copyright © 2011-2022 走看看