当前位置: 首页 > news >正文

力扣HOT100之矩阵:73. 矩阵置零


这道题我没有想到什么好的办法,直接暴力AC了,直接遍历两次矩阵,第一次遍历用两个向量分别记录出现0的行数和列数,第二次遍历就判断当前的元素的行数或者列数是否出现在之前的两个向量中,若出现了就直接置零,否则就跳过。后面看了下空间复杂度为O(1)的解法,感觉这个思路不错,记录一下。
我们可以将第0行和第0列作为记录的标志位,例如matrix[5][6] == 0,我们就将matrix[0][6]matrix[5][0]置为0,经过一次遍历后,除了第0行和第0列的情况没有统计出来,其余的行和列都已经遍历结束并且打上标签,由于打标签会向第0行和第0列添加0,打完标签后无法判断其本身原本就包含0,因此在遍历矩阵打标签之前,我们需要遍历矩阵的第0行和第0列,如果他们本身就有0,我们就分别用两个变量记录下来,至此,我们先分别遍历了矩阵的第0行和第0列,再遍历了矩阵的其余行和列,这就遍历了一次矩阵,我们再遍历一次矩阵,从下标为1的行和列开始,对于matrix[i][j],如果matrix[0][j] == 0matrix[i][0] == 0,我们就直接将matrix[i][j]置零。遍历结束后,我们还需要对第0行和第0列进行处理,如果他们原本就包含0,则将整行或整列直接置零。这里依然是遍历两次数组,但是由于只进行了比较操作,而没有进行查找操作,程序耗时要比我之前暴力AC短得多。
下面分别是暴力AC代码(空间复杂度O(m + n))和空间复杂度O(1)的代码。

//暴力代码
class Solution {
public:
    void setZeroes(vector<vector<int>>& matrix) {
        vector<int> row;
        vector<int> column;
        for(int i = 0; i < matrix.size(); ++i){
            for(int j = 0; j < matrix[i].size(); ++j){
                if(matrix[i][j] == 0){
                    row.emplace_back(i);
                    column.emplace_back(j);
                }
            }
        }
        for(int i = 0; i < matrix.size(); ++i){
            for(int j = 0; j < matrix[i].size(); ++j){
                if(find(row.begin(), row.end(), i) == row.end() 
                    && find(column.begin(), column.end(), j) == column.end())
                    continue;
                matrix[i][j] = 0;
            }
        }
    }
};
//空间复杂度O(1)代码
class Solution {
public:
    void setZeroes(vector<vector<int>>& matrix) {
        bool row_flag0 = false;   //判断第0行有没有0
        bool column_flag0 = false;  //判断第0列有没有0
        //遍历第0行
        for(int i = 0; i < matrix[0].size(); ++i){
            if(matrix[0][i] == 0){
                row_flag0 = true;
                break;
            }
        }
        //遍历第0列
        for(int i = 0; i < matrix.size(); ++i){
            if(matrix[i][0] == 0){
                column_flag0 = true;
                break;
            }
        }
        //遍历整个矩阵,在第0行和第0列标记0元素的分布情况
        for(int i = 1; i < matrix.size(); ++i){
            for(int j = 1; j < matrix[i].size(); ++j){
                if(matrix[i][j] == 0){
                    matrix[i][0] = 0;  //在第0列的对应位置置零
                    matrix[0][j] = 0;  //在第0行的对应位置置零
                }
            }
        }
        //开始置零
        for(int i = 1; i < matrix.size(); ++i){
            for(int j = 1; j < matrix[i].size(); ++j){
                if(matrix[i][0] == 0 || matrix[0][j] == 0)
                    matrix[i][j] = 0;  
            }
        }
        //判断在打标记之前第0行本身有没有0
        if(row_flag0){
            for(int i = 0; i < matrix[0].size(); ++i)
                matrix[0][i] = 0;
        }
        //判断在打标记之前第0列本身有没有0
        if(column_flag0){
            for(int i = 0; i < matrix.size(); ++i)
                matrix[i][0] = 0;
        }
    }
};

相关文章:

  • web app和网站啥区别怎么提交网址让百度收录
  • 做购物网站怎么赚钱扬州百度关键词优化
  • 做问卷调查的是哪个网站好share群组链接分享
  • 域名备案个人网站名称中国今天刚刚发生的新闻
  • 网站建设制作要学什么如何发布自己的网站
  • 织梦网站调用工具优化落实疫情防控
  • B3637 最长上升子序列
  • OpenLayers:如何使用渐变色
  • 回归预测 | Matlab实现NRBO-Transformer-BiLSTM多输入单输出回归预测
  • 基于 Three.js 实现 3D 数学欧拉角
  • Multism TL494仿真异常
  • 玛卡巴卡的k8s知识点问答题(四)
  • Spring Boot 整合 ElasticJob 分布式任务调度教程
  • pycharm虚拟环境项目转移后配置解释器
  • Spring Boot整合Redis
  • SpringBoot分布式项目订单管理实战:Mybatis最佳实践全解
  • 通俗易懂的大模型原理
  • 【自学笔记】PHP语言基础知识点总览-持续更新
  • BFD 双向转发检测协议
  • 推荐系统(十八):优势特征蒸馏(Privileged Features Distillation)在商品推荐中的应用
  • epoch、batch、batch size、step、iteration深度学习名词含义详细介绍
  • 音视频入门基础:MPEG2-TS专题(25)——通过FFmpeg命令使用UDP发送TS流
  • 深度学习之丢弃法
  • 音视频 ColorSpace色彩空间详解
  • JS数组复制方法及注意事项
  • [BJDCTF2020]Mark loves cat [git泄露][变量覆盖漏洞]