leetcode 73. Set Matrix Zeroes

73. Set Matrix Zeroes

题目要求是二维数组中出现0的地方所在行和所在列全变成0。

题目的关键是O(1)的时间复杂度,也就是在原地做。

思路:将第一行、第一列,除了(0,0)这个点的其他所有点用来记录这一行或者这一列是否出现0。

具体做法:先判断第一行第一列本身是否有0,用两个变量保存。然后遍历从(1,1)到(n-1,n-1)。一个位置出现了0,就把第一行的这一列和第一列的这一行的位置都置为0,用来表示这一行和这一列之后都需要被处理。然后遍历第一行和第一列,遇到0就将对应的一列或者一行置为0。最后再判断原始第一行第一列是否有0,如果有就把第一行或者第一列全置为0。

为什么第一行、第一列可以用来作为标记,因为只要这一行这一列出现了,那对应的第一行或者第一列那个位置本身也要被置为0,并且不管这一行或者这一列出现多少次,反正都是要被置为0。

class Solution {
public:
    void setZeroes(vector<vector<int>>& matrix) {
        int m = matrix.size();
        if(m <= 0)
            return;
        int n = matrix[0].size();
        if(n <= 0)
            return;
        bool flag_row = false,flag_col = false;
        for(int j = 0;j < n;j++){
            if(matrix[0][j] == 0){
                flag_row = true;
                break;
            }
        }
        for(int i = 0;i < m;i++){
            if(matrix[i][0] == 0){
                flag_col = true;
                break;
            }
        }
        for(int i = 1;i < m;i++){
            for(int j = 1;j < n;j++){
                if(matrix[i][j] == 0){
                    matrix[i][0] = 0;
                    matrix[0][j] = 0;
                }
            }
        }
        for(int i = 1;i < m;i++){
            if(matrix[i][0] == 0){
                for(int j = 1;j < n;j++)
                    matrix[i][j] = 0;
            }
        }
        for(int j = 1;j < n;j++){
            if(matrix[0][j] == 0){
                for(int i = 1;i < m;i++)
                    matrix[i][j] = 0;
            }
        }
        if(flag_row){
            for(int j = 0;j < n;j++)
                matrix[0][j] = 0;
        }
        if(flag_col){
            for(int i = 0;i < m;i++)
                matrix[i][0] = 0;
        }
        return;
    }
};

 

posted @ 2019-05-25 22:32  有梦就要去实现他  阅读(173)  评论(0编辑  收藏  举报