0 题目来源

力扣《程序员面试金典》

1 涉及到的知识点

矩阵、数组、set的使用

set:

C++中的一种STL,是一种集合,可以不重复地存放数据,插入数据后,在set内部会自动递增排序。
需要:
#include<set>
声明set(int类型):
set<int> s;
set插入数据(如果插入set内已有的数据,则无效):
s.insert(num);
使用迭代器遍历set:

  1. for(set<int>::iterator it=c.begin();it!=c.end();it++)
  2. {
  3. cout<<*it;//注意:使用迭代器时,迭代的某一项要加*号
  4. }

vector<vector<int>>vec不符合C++98标准,需要这样:vector<vector<int> >vec

特殊思路

使用矩阵本身来记录信息,节省空间

2 题目描述

编写一种算法,若M × N矩阵中某个元素为0,则将其所在的行与列清零。

3 样例

示例 1:
输入:
[
[1,1,1],
[1,0,1],
[1,1,1]
]
输出:
[
[1,0,1],
[0,0,0],
[1,0,1]
]

示例 2:
输入:
[
[0,1,2,0],
[3,4,5,2],
[1,3,1,5]
]
输出:
[
[0,0,0,0],
[0,4,5,0],
[0,3,1,0]
]

4 思路

方法一:使用set记录行列为零的情况

可以设置两个set,分别在遍历矩阵的过程中记录行列为零的情况。行set为r,记录需要设为零的行序号,列set为c,记录需要设为零的列序号。
记录完成后,遍历两个set,将相应行和列设为0。

方法二:使用矩阵本身记录行列为零的情况

为了减少空间复杂度,可以使用矩阵的第一行和第一列来记录每行每列为零的情况,然后另外使用一个变量记录第一行为零的情况,使用矩阵的[0][0]元素记录第一列为零的情况。
——本思路来自力扣官方题解

5 代码

方法一

  1. class Solution {
  2. public:
  3. void setZeroes(vector<vector<int>>& matrix) {
  4. set<int> r,c;
  5. for(int i=0;i<matrix.size();i++)
  6. {
  7. for(int j=0;j<matrix[i].size();j++)
  8. {
  9. if(matrix[i][j]==0)
  10. {
  11. r.insert(i);
  12. c.insert(j);
  13. }
  14. }
  15. }
  16. for(set<int>::iterator it=r.begin();it!=r.end();it++)
  17. for(int i=0;i<matrix[*it].size();i++)
  18. matrix[*it][i]=0;
  19. for(set<int>::iterator it=c.begin();it!=c.end();it++)
  20. for(int i=0;i<matrix.size();i++)
  21. matrix[i][*it]=0;
  22. }
  23. };

方法二

来自力扣官方题解

  1. class Solution {
  2. public:
  3. void setZeroes(vector<vector<int>>& matrix) {
  4. int m = matrix.size();
  5. int n = matrix[0].size();
  6. int flag_col0 = false;
  7. for (int i = 0; i < m; i++) {
  8. if (!matrix[i][0]) {
  9. flag_col0 = true;
  10. }
  11. for (int j = 1; j < n; j++) {
  12. if (!matrix[i][j]) {
  13. matrix[i][0] = matrix[0][j] = 0;
  14. }
  15. }
  16. }
  17. for (int i = m - 1; i >= 0; i--) {
  18. for (int j = 1; j < n; j++) {
  19. if (!matrix[i][0] || !matrix[0][j]) {
  20. matrix[i][j] = 0;
  21. }
  22. }
  23. if (flag_col0) {
  24. matrix[i][0] = 0;
  25. }
  26. }
  27. }
  28. };