Cover image for 面试经典150题 P73 矩阵置零

面试经典150题 P73 矩阵置零


时间轴

时间轴

2025-11-17

init

矩阵

题目:

最开始我是这样写的,但是用哈希表存储效率很低。

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)) { // 这一行都为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;				}			}		}	}};

可以改成数组形式记录:

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;                }            }        }    }};

如果要再节省空间的话,可以找到数组中第一个为 0 的元素,用它的行列数组当作记录为 0 的行/列。最后再把它置零。

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) // 没有一个0                        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) {                                // i 行都是 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) {                                // 第j列都是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");        }}
评论加载中…