矩阵原地置零的两种算法

73. 矩阵置零

给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0。请使用原地算法。

示例:

示例 1:

输入: 
[
  [1,1,1],
  [1,0,1],
  [1,1,1]
]
输出: 
[
  [1,0,1],
  [0,0,0],
  [1,0,1]
]
示例 2:

输入: 
[
  [0,1,2,0],
  [3,4,5,2],
  [1,3,1,5]
]
输出: 
[
  [0,0,0,0],
  [0,4,5,0],
  [0,3,1,0]
]

方法一:

第一步:用两个布尔变量rowFlag,colFlag来记录第0行和第0列是否有0需要置行、列为0;

第二步:从matrix[1][1]开始遍历,当遍历到matrix[i][j]时需要将i行,j列的值置零,将这个结果记录到第0行和第0列中,也就是将matrix[0][j],matrix[i][0]置零;

第三步:分别遍历第0行和第0列,遍历第0行遇到0时将此列置零,遍历第0列遇到0时将此行置零。

第四部:判断rowFlag,colFlag是否为true,rowFlag为true时将第0行置0,colFlag为true时将第0列置0。

代码:

class Solution {
    public void setZeroes(int[][] matrix) {
        boolean rowFlag = false;
        boolean colFlag = false;
        for(int i=0; i<matrix.length; i++){
            if(matrix[i][0] == 0){
                rowFlag = true;
            }
        }
        for(int j=0; j<matrix[0].length; j++){
            if(matrix[0][j] == 0){
                colFlag = true;
            }
        }
        for(int i=1; i<matrix.length; i++){
            for(int j=1; j<matrix[0].length; j++){
                if(matrix[i][j] == 0){
                    matrix[0][j] = 0;
                    matrix[i][0] = 0;
                }
            }
        }
        for(int i=1; i<matrix.length; i++){
            if(matrix[i][0] == 0){
                for(int k =1; k<matrix[0].length; k++){
                    matrix[i][k] = 0;
                }
            }
        }
        for(int j=1; j<matrix[0].length; j++){
            if(matrix[0][j] == 0){
                for(int k =1; k<matrix.length; k++){
                    matrix[k][j] = 0;
                }
            }
        }
        if(rowFlag){
            for(int i=0; i<matrix.length; i++){
                matrix[i][0] = 0;
            }
        }
        if(colFlag){
            for(int j=0; j<matrix[0].length; j++){
                matrix[0][j] = 0;
            }
        }
    }
}

方法二:

设置一个很大的负虚拟值(不同那个情况下而定),遍历数组,遍历到matrix[i][j]为0时,将第i行和第j列所有的非0数全部置为虚拟值,最后再将数组中的虚拟值全部置为0。(这个方法在虚拟值本身就出现在数组中时会存在问题,所以可以先加一步验证。)

代码:

class Solution {
    public void setZeroes(int[][] matrix) {
        int MODIFIED = -1000;
        boolean f = true;
        for(int i=0;i<matrix.length; i++){
            for(int j=0;j<matrix[0].length; j++){
                if(matrix[i][j] == 0){
                    for(int m=0;m<matrix.length; m++){
                        if(matrix[m][j] != 0){
                            matrix[m][j] = MODIFIED;
                        }
                    }
                    for(int n=0;n<matrix[i].length; n++){
                        if(matrix[i][n] != 0){
                            matrix[i][n] = MODIFIED;
                        }
                    }
                }
            }
        }
        for(int i=0;i<matrix.length; i++){
            for(int j=0;j<matrix[0].length; j++){
                if(matrix[i][j] == MODIFIED){
                    matrix[i][j] = 0;
                }
            }
        }
    }
}

 

发布了159 篇原创文章 · 获赞 65 · 访问量 6万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 终极编程指南 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览