zoukankan      html  css  js  c++  java
  • [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 }
  • 相关阅读:
    【洛谷】P2880 [USACO07JAN]平衡的阵容Balanced Lineup(st表)
    【洛谷】P1052 过河(状压dp)
    【洛谷】P1541 乌龟棋(四维背包dp)
    【BZOJ】4721: [Noip2016]蚯蚓 / 【洛谷】P2827 蚯蚓(单调队列)
    【洛谷】P1064 金明的预算方案(dp)
    【洛谷】P3908 异或之和(异或)
    【洛谷】P2434 [SDOI2005]区间(暴力)
    【洛谷】P2694 接金币(排序)
    【BZOJ】1012: [JSOI2008]最大数maxnumber /【洛谷】1198(线段树)
    【游记】noip2017酱油记
  • 原文地址:https://www.cnblogs.com/Phoebe815/p/4132771.html
Copyright © 2011-2022 走看看