LeetCode 力扣 热题 100道(二十八)矩阵置零(C++)

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

cpp 复制代码
class Solution {
public:
    void setZeroes(vector<vector<int>>& matrix) {
        int m = matrix.size();
        int n = matrix[0].size();
        
        // 标记第一行和第一列是否需要置零
        bool firstRowZero = false, firstColZero = false;
        
        // 检查第一列是否有零
        for (int i = 0; i < m; ++i) {
            if (matrix[i][0] == 0) {
                firstColZero = true;
                break;
            }
        }
        
        // 检查第一行是否有零
        for (int j = 0; j < n; ++j) {
            if (matrix[0][j] == 0) {
                firstRowZero = true;
                break;
            }
        }
        
        // 用第一行和第一列作为标记
        for (int i = 1; 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 = 1; i < m; ++i) {
            for (int j = 1; j < n; ++j) {
                if (matrix[i][0] == 0 || matrix[0][j] == 0) {
                    matrix[i][j] = 0;
                }
            }
        }
        
        // 处理第一列
        if (firstColZero) {
            for (int i = 0; i < m; ++i) {
                matrix[i][0] = 0;
            }
        }
        
        // 处理第一行
        if (firstRowZero) {
            for (int j = 0; j < n; ++j) {
                matrix[0][j] = 0;
            }
        }
    }
};

标记需要置零的行和列

我们不能直接修改矩阵,因为这样会影响后续的判断。因此,我们可以利用矩阵的第一行和第一列作为标记,用来记录哪些行和列需要置零。

具体步骤

遍历矩阵,找到为零的元素,将对应的行和列的第一个元素置为零(即标记)。

再次遍历矩阵,使用标记的信息将对应的行和列置为零。

需要额外的变量来记录第一行和第一列是否需要置零,因为这两个被用作标记列。

时间复杂度和空间复杂度

时间复杂度:O(m * n),需要遍历两次矩阵。

空间复杂度:O(1),只使用了常数额外空间。

相关推荐
a努力。5 分钟前
国家电网Java面试被问:最小生成树的Kruskal和Prim算法
java·后端·算法·postgresql·面试·linq
王燕龙(大卫)5 分钟前
fastdds:DataWriter和DataReader匹配规则
c++
洛生&11 分钟前
Counting Towers
算法
CSDN_RTKLIB17 分钟前
CMake几个命令顺序
c++
Evand J19 分钟前
【MATLAB例程,附代码下载链接】基于累积概率的三维轨迹,概率计算与定位,由轨迹匹配和滤波带来高精度位置,带测试结果演示
开发语言·算法·matlab·csdn·轨迹匹配·候选轨迹·完整代码
X在敲AI代码23 分钟前
LeetCode 基础刷题D2
算法·leetcode·职场和发展
源代码•宸27 分钟前
Leetcode—1929. 数组串联&&Q1. 数组串联【简单】
经验分享·后端·算法·leetcode·go
数据大魔方37 分钟前
【期货量化实战】跨期套利策略:价差交易完整指南(TqSdk源码详解)
数据库·python·算法·github·程序员创富
weixin_4617694039 分钟前
15. 三数之和
c++·算法·leetcode·三数之和
NAGNIP41 分钟前
一文搞懂机器学习中的学习理论!
算法·面试