# 73 - Set Matrix Zeroes

解法一 - 先記錄哪些 row 跟 col 要設成 0,再重新設定

這個解法算是很直觀,只是除了花 O(MN) 的時間之外,還得花 O(M+N) 的空間。

class Solution {
public:
    void setZeroes(vector<vector<int>>& matrix) {
        int m = matrix.size();
        int n = matrix[0].size();
        set<int> rows;
        set<int> cols;

        for(int r=0; r<m; r++) {
            for(int c=0; c<n; c++) {
                if(matrix[r][c] == 0) {
                    rows.insert(r);
                    cols.insert(c);
                }
            }
        }

        for(int r=0; r<m; r++) {
            for(int c=0; c<n; c++) {
                if(rows.find(r) != rows.end() || cols.find(c) != cols.end()) {
                    matrix[r][c] = 0;
                }
            }
        }
    }
};

解法二 - 暴力法

首先將應該被改成 0 位置的 value 變成一個在矩陣裡不會出現的值,都設定完之後,再走過一次矩陣把這些值設成 0 就好。必須要這樣做是因為如果在過程中就直接把這些設成 0,那整個矩陣就都得變成 0 了。

class Solution {
public:
    void setZeroes(vector<vector<int>>& matrix) {
        int MODIFIED = -10000;
        int m = matrix.size();
        int n = matrix[0].size();

        for(int r=0; r<m; r++) {
            for(int c=0; c<n; c++) {
                if(matrix[r][c] == 0) {
                    for (int k = 0; k < n; k++) {
                        if (matrix[r][k] != 0) {
                            matrix[r][k] = MODIFIED;
                        }
                     }
                     for (int k = 0; k < m; k++) {
                        if (matrix[k][c] != 0) {
                            matrix[k][c] = MODIFIED;
                        }
                     }
                }
            }
        }

        for(int r=0; r<m; r++) {
            for(int c=0; c<n; c++) {
                if(matrix[r][c] == MODIFIED) {
                    matrix[r][c] = 0;
                }
            }
        }
    }
};

這個方法的空間複雜度確實是 O(1),但因為最糟情況是每一個位置都得把他那個 row 跟 col 的改成 MODIFIED,所以時間複雜度是 O(MN*(M+N))。

解法三 - 用各 row & col 的頭當作 flag 來標記這一個 row 跟 col 要不要設成 0

實作如下:

class Solution {
public:
    void setZeroes(vector<vector<int>>& matrix) { 
        int m = matrix.size();
        int n = matrix[0].size();
        bool isCol = false;

        for(int r=0; r<m; r++) {
            // Since first cell for both first row and first column is the same 
            // i.e. matrix[0][0]
            // We can use an additional variable for either the first row/column.
            // We use isCol variable for the first column
            // and using matrix[0][0] for the first row.
            if (matrix[r][0] == 0) {
                isCol = true;
            }

            for(int c=1; c<n; c++) {
                if (matrix[r][c] == 0) {
                    matrix[0][c] = 0;
                    matrix[r][0] = 0;
                }
            }
        }

        // We need to start from r = 1 & c = 1
        // because if matrix[0][0] == 0
        // we will set matrix[0][c] to 0 for all c
        // then we will set the whoiel matrix to 0
        for(int r=1; r<m; r++) {
            for(int c=1; c<n; c++) {
                if (matrix[r][0] == 0 || matrix[0][c] == 0) {
                    matrix[r][c] = 0;
                }
            }
        }

        if(matrix[0][0] == 0) {
            for(int c=0; c<n; c++) {
                matrix[0][c] = 0;
            }
        }

        if (isCol) {
            for (int r=0; r<m; r++) {
                matrix[r][0] = 0;
            }
        }
    }
};

Last updated