• 力扣每日一题73:矩阵置零


    题目描述:

    给定一个 m x n 的矩阵,如果一个元素为 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法

    示例 1:

    输入:matrix = [[1,1,1],[1,0,1],[1,1,1]]
    输出:[[1,0,1],[0,0,0],[1,0,1]]
    

    示例 2:

    输入:matrix = [[0,1,2,0],[3,4,5,2],[1,3,1,5]]
    输出:[[0,0,0,0],[0,4,5,0],[0,3,1,0]]
    

    提示:

    • m == matrix.length
    • n == matrix[0].length
    • 1 <= m, n <= 200
    • -231 <= matrix[i][j] <= 231 - 1

    进阶:

    • 一个直观的解决方案是使用  O(mn) 的额外空间,但这并不是一个好的解决方案。
    • 一个简单的改进方案是使用 O(m + n) 的额外空间,但这仍然不是最好的解决方案。
    • 你能想出一个仅使用常量空间的解决方案吗?

    通过次数

    286.9K

    提交次数

    446.4K

    通过率

    64.3%

    思路和题解:

    一、先遍历一次矩阵,用一个数组row和一个数组col标记要置零的行和列,随后再遍历一次矩阵,如果矩阵所在行或列要置0,那就变零。时间复杂度O(m*n),空间复杂度O(m+n)

    代码:

    1. class Solution {
    2. public:
    3. void setZeroes(vectorint>>& matrix) {
    4. int m=matrix.size();
    5. int n=matrix[0].size();
    6. //记录要置零的行和列
    7. vector<int> row(m,0);
    8. vector<int> col(n,0);
    9. for(int i=0;i
    10. for(int j=0;j
    11. if(matrix[i][j]==0)
    12. row[i]=col[j]=1;
    13. for(int i=0;i
    14. for(int j=0;j
    15. if(row[i]==1||col[j]==1)
    16. matrix[i][j]=0;
    17. }
    18. };

    二、方法一的改进,矩阵的第一行和第一列代替col和row,实现O(1)空间复杂度,但矩阵的第一行和第一列有交叉,交叉的位置既要标记第一行是否出现零,又要标记第一列是否出现零,所以我们应该额外设置一个变量flag,flag与matrix[0][0]一个标记第一行是否出现零,一个标记第一列是否出现零。

    代码:

    1. lass Solution {
    2. public:
    3. void setZeroes(vectorint>>& matrix) {
    4. int m=matrix.size();
    5. int n=matrix[0].size();
    6. bool flag_col0=false;
    7. //标记
    8. for(int i=0;i
    9. {
    10. if(matrix[i][0]==0) flag_col0=true;
    11. for(int j=1;j
    12. {
    13. if(matrix[i][j]==0)
    14. matrix[i][0]=matrix[0][j]=0;
    15. }
    16. }
    17. // 置零
    18. for(int i=1;i
    19. {
    20. for(int j=1;j
    21. {
    22. if(matrix[i][0]==0||matrix[0][j]==0)
    23. matrix[i][j]=0;
    24. }
    25. }
    26. if(matrix[0][0]==0)
    27. for(int j=0;j0][j]=0;
    28. if(flag_col0==true)
    29. for(int j=0;j0]=0;
    30. }
    31. };

  • 相关阅读:
    爬虫代理ip池创建【使用redis TTL实现】
    Python-代码封装思想
    Windows窗体程序开启console(cmd命令行)
    【ARM】使用Ubuntu-base构建根文件系统
    循环赛-(单循环)
    Django面试题和出现的一些问题
    利用torch.nn实现softmax回归Fashion-MNIST数据集上进行训练和测试
    javaweb01
    CSS进阶(2)- 块级格式化上下文
    Vue中父子组件通信方式
  • 原文地址:https://blog.csdn.net/m0_73441691/article/details/134087876