Cover image for Interview Classic 150 Questions P73 Set Matrix Zeroes

Interview Classic 150 Questions P73 Set Matrix Zeroes


Timeline

Timeline

2025-11-17

init

Matrix

Problem:

At first I wrote it like this, but using a hash table for storage is inefficient.

12345678910111213141516171819202122232425262728293031323334
#include <vector>#include <unordered_set>using std::vector;using std::unordered_set;class Solution {    public:	void setZeroes(vector<vector<int> > &matrix)	{		unordered_set<int> iuset;		unordered_set<int> juset;		int i, j, m = matrix.size(), n = matrix[0].size();		for (i = 0; i < m; i++) {			for (j = 0; j < n; j++) {				if (matrix[i][j] == 0) {					iuset.insert(i);					juset.insert(j);				}			}		}		for (i = 0; i < m; i++) {			if (iuset.count(i)) { // This row is all 0				std::fill(matrix[i].begin(), matrix[i].end(), 0);				continue;			}			for (j = 0; j < n; j++) {				if (juset.count(j)) {					matrix[i][j] = 0;				}			}		}	}};

You can change to recording in array form:

1234567891011121314151617181920212223
class Solution {public:    void setZeroes(vector<vector<int>>& matrix) {        int m = matrix.size();        int n = matrix[0].size();        vector<int> row(m), col(n);        for (int i = 0; i < m; i++) {            for (int j = 0; j < n; j++) {                if (!matrix[i][j]) {                    row[i] = col[j] = true;                }            }        }        for (int i = 0; i < m; i++) {            for (int j = 0; j < n; j++) {                if (row[i] || col[j]) {                    matrix[i][j] = 0;                }            }        }    }};

If you want to save more space, you can**Find the first element in the array that is 0, and use its row and column arrays to record the rows/columns that are 0.**Finally, set it to zero.

leetcode hot 100 rewrite:

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
#include <vector>using std::vector;class Solution {    public:        void setZeroes(vector<vector<int> > &matrix)        {                int i, j, m = matrix.size(), n = matrix[0].size();                int flagi, flagj;                bool fflag = false;                for (i = 0; i < m; i++) {                        for (j = 0; j < n; j++) {                                if (matrix[i][j] == 0) {                                        flagi = i;                                        flagj = j;                                        fflag = true;                                        break;                                }                        }                        if (fflag)                                break;                }                if (!fflag) // There is no zero                        return;                for (i = 0; i < m; i++) {                        if (matrix[i][flagj] != 0) {                                // if matrix[i][flagj] == 0 it means row i is 0                                matrix[i][flagj] = -1;                        }                }                for (j = 0; j < n; j++) {                        if (matrix[flagi][j] != 0) {                                // if matrix[flagi][j] == 0 it means column j is 0                                matrix[flagi][j] = -1;                        }                }                for (i = 0; i < m; i++) {                        if (i == flagi)                                continue;                        for (j = 0; j < n; j++) {                                if (j == flagj)                                        continue;                                if (matrix[i][j] == 0) {                                        matrix[flagi][j] = 0; // tag as column j is 0                                        matrix[i][flagj] = 0; // tag as row i is 0                                }                        }                }                for (i = 0; i < m; i++) {                        if (matrix[i][flagj] == 0) {                                // Row i is all 0                                if (i == flagi)                                        continue;                                for (j = 0; j < n; j++) {                                        if (j == flagj)                                                continue;                                        matrix[i][j] = 0;                                }                        }                }                for (j = 0; j < n; j++) {                        if (matrix[flagi][j] == 0) {                                // Column j is all 0                                if (j == flagj)                                        continue;                                for (i = 0; i < m; i++) {                                        if (i == flagi)                                                continue;                                        matrix[i][j] = 0;                                }                        }                }                for (i = 0; i < m; i++)                        matrix[i][flagj] = 0;                for (j = 0; j < n; j++)                        matrix[flagi][j] = 0;        }};#include <stdio.h>int main(){        Solution S;        vector<vector<int> > matrix = { { 1, 1, 1 }, { 1, 0, 1 }, { 1, 1, 1 } };        S.setZeroes(matrix);        for (vector<int> &vec : matrix) {                for (int val : vec) {                        printf("%d ", val);                }                printf("\n");        }}
Loading comments…