73 矩阵置零

解题思路:
\qquad 原地算法,指除原有输入资料所占空间外,使用额外空间尽可能少(常数空间)的算法。本题容易想到的一种解法是,对于m x n的矩阵,一次遍历把含有0元素的行号、列号记录下来,然后再一次遍历把对应的行、列元素值更新为0,随后输出。这样所用的空间复杂度为 O ( m + n ) O(m+n) O(m+n),但其实可以进一步优化,使空间复杂度变为 O ( 1 ) O(1) O(1)。

\qquad 为了达到 O ( 1 ) O(1) O(1),需要利用原输入矩阵的空间,记录含有0的行号、列号。可以更改矩阵第一行、第一列的数字来记录是否含有0。至于第一行是否含有0元素,可以使用第一列的第一个元素记录,第一列本身是否含有0,可以使用额外的bool变量单独记录。

\qquad 记录是否含0的过程,可以按照任意顺序开展,但更新矩阵0元素时,需注意最后处理第一行、第一列的元素,不然会影响其他矩阵元素记录的信息。

cpp 复制代码
	void setZeroes(vector<vector<int>>& matrix) {
        bool isZero = false;
        int m = matrix.size(), n = matrix[0].size();
        for(int i = 0; i < m; i++)
        {
            if(matrix[i][0] == 0) isZero = true;
        }

        for(int i = 0; i < m; i++)
        {
            for(int j = 1; j < n; j++)
            {
                if(matrix[i][j] == 0)
                {
                    matrix[i][0] = 0;
                    matrix[0][j] = 0;
                }
            }
        }

        for(int i = m-1; i >= 0; i--)
        {
            for(int j = 1; j < n; j++)
            {
                if(matrix[i][0] == 0 || matrix[0][j] == 0)
                {
                    matrix[i][j] = 0;
                }
            }
        }
        
        if(isZero)
        {
            for(int i = 0; i < m; i++)
            {
                matrix[i][0] = 0;
            }
        }
    }
相关推荐
旖旎夜光41 分钟前
【C++ 基础入门】C++ 多态(中):虚函数表、多态原理与动静绑定
开发语言·c++·笔记·学习
Rain的Java大神之路1 小时前
LeetCode 37 解数独面试攻略:回溯 + 位掩码 + MRV,从暴力到毫秒级求解
java·后端·leetcode
旖旎夜光2 小时前
【C++ 基础入门】C++多态(下):单/多继承虚表、多态补充与 21 道高频题
开发语言·c++·笔记·学习
Pniubi2 小时前
力扣73 矩阵置零
算法·leetcode·矩阵
apcipot_rain12 小时前
C++转Java日记(03)
java·开发语言·c++
布莱克60512 小时前
C++ 中 map 的 insert 与 emplace:key 已存在时会覆盖吗?
开发语言·数据结构·c++·算法·map
xys_67812 小时前
深挖C++:类和对象(中)
开发语言·c++
D e re k ZH15 小时前
C++ 系统学习手记:从语法细节到工程实践
开发语言·数据结构·c++·算法
xiaoye-duck16 小时前
《C++ 项目:手写大模型接入 SDK》Ollama接口设计(上):初始化、全量响应实现和测试
开发语言·网络·c++·语言模型
zaizai100717 小时前
【Effective Modern C++】学习第一章
c++