矩阵----=矩阵置零

🔥个人主页: Milestone-里程碑

❄️个人专栏: <<力扣hot100>> <<C++>><<Linux>>

<<Git>><<MySQL>>

🌟心向往之行必能至

题目解析

给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0。要求使用原地算法,即空间复杂度为 O (1)。

直接的思路是先遍历矩阵,记录所有 0 所在的行和列,然后再根据记录去置零。但这样会使用 O (m+n) 的额外空间。要实现 O (1) 空间,我们需要利用矩阵的第一行和第一列来存储这些标记信息。

核心思路

  1. 标记首行首列 :首先检查矩阵的第一行和第一列,看它们本身是否包含 0,并用两个布尔变量 row0col0 记录下来。
  2. 利用首行首列做标记 :遍历矩阵中除第一行和第一列的其他元素。如果发现 matrix[i][j] == 0,就将其对应的行标记 matrix[i][0] 和列标记 matrix[0][j] 置为 0。
  3. 根据标记置零:再次遍历矩阵中除第一行和第一列的元素,如果其对应的行标记或列标记为 0,则将该元素置零。
  4. 处理首行首列 :最后根据最开始记录的 row0col0,决定是否将第一行和第一列整体置零。

完整代码

cpp

复制代码
class Solution {
public:
    void setZeroes(vector<vector<int>>& matrix) {
        int m = matrix.size();
        int n = matrix[0].size();
        bool row0 = false, col0 = false;

        // 检查第一行是否有0
        for (int j = 0; j < n; ++j) {
            if (matrix[0][j] == 0) {
                row0 = true;
                break;
            }
        }

        // 检查第一列是否有0
        for (int i = 0; i < m; ++i) {
            if (matrix[i][0] == 0) {
                col0 = 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;
                }
            }
        }

        // 如果首行原本有0,将首行置零
        if (row0) {
            for (int j = 0; j < n; ++j) {
                matrix[0][j] = 0;
            }
        }

        // 如果首列原本有0,将首列置零
        if (col0) {
            for (int i = 0; i < m; ++i) {
                matrix[i][0] = 0;
            }
        }
    }
};

复杂度分析

  • 时间复杂度 :O(m*n)
    • 我们对矩阵进行了多次线性遍历,总的时间复杂度与矩阵元素的数量成正比。
  • 空间复杂度 :O(1)
    • 我们只使用了两个额外的布尔变量,满足了原地算法的要求。

示例演示

matrix = [[0,1,2,0],[3,4,5,2],[1,3,1,5]] 为例:

  1. 检查首行首列:首行有 0(row0 = true),首列有 0(col0 = true)。
  2. 标记:遍历其他元素,发现 matrix[0][0]matrix[0][3] 已为 0,无需额外标记。
  3. 置零:根据标记,将除首行首列外的元素置零,得到 [[0,1,2,0],[0,4,5,0],[0,3,1,0]]
  4. 处理首行首列:因为 row0col0 都为 true,所以将首行和首列全部置零,得到最终结果 [[0,0,0,0],[0,4,5,0],[0,3,1,0]]
相关推荐
Giggle121821 小时前
上门维修预约小程序开发全流程:从核心功能设计到技术选型实践
大数据·个人开发·内容运营
6Hzlia21 小时前
【Hot 100 刷题计划】 LeetCode 739. 每日温度 | C++ 逆序单调栈
c++·算法·leetcode
良木生香21 小时前
【C++初阶】:STL——String从入门到应用完全指南(1)
c语言·开发语言·数据结构·c++·算法
XWalnut1 天前
LeetCode刷题 day16
数据结构·算法·leetcode·链表·动态规划
Elastic 中国社区官方博客1 天前
Elastic Security、Observability 和 Search 现在在你的 AI 工具中提供交互式 UI
大数据·运维·人工智能·elasticsearch·搜索引擎·安全威胁分析·可用性测试
TechubNews1 天前
Base 发布首个独立 OP Stack 框架的网络升级 Azul,将是 L2 自主迭代的开端?
大数据·网络·人工智能·区块链·能源
金融小师妹1 天前
AI政策框架解析:凯文·沃什货币体系重构与美联储治理范式转型
大数据·人工智能·重构·逻辑回归
foundbug9991 天前
基于混合整数规划的电池容量优化 - MATLAB实现
数据结构·算法·matlab
多年小白1 天前
中科院 Ouroboros 晶圆级存算一体芯片深度解析
大数据·网络·人工智能·科技·ai
SelectDB1 天前
从 T+1 到分钟级:金城银行基于 Apache Doris 构建高可靠、强一致的实时数据平台
大数据·数据库·数据分析