1. 题目

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

对matrixi==0的部分,对i行、j列全部原地置为0.

2. 思路

找到第一个0的位置,将这个位置的行和列作为标记数组。

3. 代码

耗时:53ms

class Solution {
public:
    // 遍历找到第一个0,用这个0所在的行和列作为对应行列是否有0的标记位组。
    void setZeroes(vector<vector<int>>& matrix) {
        if (matrix.size() == 0) { return ; }
        // 计算行列为0的标签
        int flag_i = -1;
        int flag_j = -1;
        for (int i = 0; i < matrix.size(); i++) {
            vector<int>& line = matrix[i];
            for (int j = 0; j < line.size(); j++) {
                if (line[j] != 0) { continue; }
                if (flag_i == -1) {
                    flag_i = i;
                    flag_j = j;
                    break;  // 标签行可以跳过了
                } else {
                    matrix[i][flag_j] = 0;
                    matrix[flag_i][j] = 0;
                }
            }
        }
        if (flag_i == -1) { return ; }
        
        // 清理行列为0的
        vector<int>& flag_line = matrix[flag_i];
        for (int i = 0; i < matrix.size(); i++) {
            if (i == flag_i) { continue; }
            vector<int>& line = matrix[i];
            for (int j = 0; j < line.size(); j++) {
                if (j == flag_j) { continue; }
                if (line[flag_j] == 0 || flag_line[j] == 0) {
                    line[j] = 0;
                }
            }
            line[flag_j] = 0; // 最后清理一下标记列位
        }

        // 清理标记行
        for (int j = 0; j < flag_line.size(); j++) { flag_line[j] = 0; }
        return ;
    }
};

knzeus
72 声望28 粉丝

行万里路,读万卷书