• [Leetcode] Set Matrix Zeroes


    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?

     
    Solution 1:
    利用矩阵的第一行和第一列来作为辅助空间使用。不用开辟新的存储空间。方法就是:
    1.先确定第一行和第一列是否需要清零
    即,看看第一行中是否有0,记下来。也同时记下来第一列中有没有0。

    2.扫描剩下的矩阵元素,如果遇到了0,就将对应的第一行和第一列上的元素赋值为0
    这里不用担心会将本来第一行或第一列的1改成了0,因为这些值最后注定要成为0的。

    3.根据第一行和第一列的信息,已经可以将剩下的矩阵元素赋值为结果所需的值了
    即,拿第一行为例,如果扫描到一个0,就将这一列都清0.

    4.根据1中确定的状态,处理第一行和第一列。
    如果最开始得到的第一行中有0的话,就整行清零。同理对列进行处理。
     1 public class Solution {
     2     public void setZeroes(int[][] matrix) {
     3         if(matrix==null)
     4             return;
     5         if(matrix[0]==null)
     6             return;
     7         int m=matrix.length;
     8         int n=matrix[0].length;
     9         boolean col=false;
    10         boolean row=false;
    11         for(int i=0;i<m;++i){
    12             if(matrix[i][0]==0){
    13                 col=true;
    14                 break;
    15             }
    16         }
    17         for(int i=0;i<n;++i){
    18             if(matrix[0][i]==0){
    19                 row=true;
    20                 break;
    21             }
    22         }
    23         for(int i=1;i<m;++i){
    24             for(int j=1;j<n;++j){
    25                 if(matrix[i][j]==0){
    26                     matrix[0][j]=0;
    27                     matrix[i][0]=0;
    28                 }
    29             }
    30         }
    31         for(int i=1;i<n;++i){
    32             if(matrix[0][i]==0){
    33                 for(int j=1;j<m;++j){
    34                     matrix[j][i]=0;
    35                 }
    36             }
    37         }
    38         for(int i=1;i<m;++i){
    39             if(matrix[i][0]==0){
    40                 for(int j=1;j<n;++j){
    41                     matrix[i][j]=0;
    42                 }
    43             }
    44         }
    45         if(row){
    46             for(int i=0;i<n;++i)
    47                 matrix[0][i]=0;
    48         }
    49         if(col){
    50             for(int j=0;j<m;++j){
    51                 matrix[j][0]=0;
    52             }
    53         }
    54     }
    55 }
     
    Solution 2:
     1 public class Solution {
     2     public void setZeroes(int[][] matrix) {
     3         if(matrix==null)
     4             return;
     5         if(matrix[0]==null)
     6             return;
     7         int[] row=new int[matrix.length];
     8         int[] col=new int[matrix[0].length];
     9         for(int i=0;i<matrix.length;++i){
    10             for(int j=0;j<matrix[0].length;++j){
    11                 if(matrix[i][j]==0){
    12                     row[i]=-1;
    13                     col[j]=-1;
    14                 }
    15             }
    16         }
    17         for(int i=0;i<matrix.length;++i){
    18             for(int j=0;j<matrix[0].length;++j){
    19                 if(row[i]==-1||col[j]==-1){
    20                     matrix[i][j]=0;
    21                 }
    22             }
    23         }
    24     }
    25 }
  • 相关阅读:
    Lambda表达式
    工具类:mybatis中使用Threadlocal开启session及关闭session
    构造函数
    window phone ListBox多选
    ZOJ 3681 ZJU2013年01月月赛F题 E Cup 2
    2012百度之星冬季赛第四场第二题 度熊的复仇
    HDU 4476 HDOJ Cut the rope
    HDU 4475 HDOJ Downward paths
    2012百度之星冬季赛第二场第二题 消去游戏I
    ZOJ 3684 ZJU2013年01月月赛I题 Destroy
  • 原文地址:https://www.cnblogs.com/Phoebe815/p/4132771.html
Copyright © 2020-2023  润新知