矩阵----=矩阵置零

🔥个人主页: Milestone-里程碑

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

<<Git>><<MySQL>>

🌟心向往之行必能至

题目解析

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

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

核心思路

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

完整代码

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. 处理首行首列:因为 row0 和 col0 都为 true,所以将首行和首列全部置零,得到最终结果 [[0,0,0,0],[0,4,5,0],[0,3,1,0]]。
相关推荐
朝朝辞暮i5 小时前
C++ 第 31C 课:Subscriber 到底是什么
开发语言·c++·算法
Evand J6 小时前
【MATLAB例程】三维RRT+APF路径规划与AOA-TDOA融合定位算法。附代码的下载链接
算法·matlab·路径规划·rrt·tdoa·apf·aoa
计算机毕业编程指导师6 小时前
Python大数据毕设:基于Hadoop的病毒式社交媒体趋势和参与度分析系统怎么做 源码 毕业设计 选题推荐 毕设选题 数据分析 机器学习
大数据·hadoop·python·计算机·毕业设计·课程设计·社交媒体
计算机毕业编程指导师6 小时前
【计算机毕设选题推荐】基于Spark与Hadoop的AI就业收入区域差异分析系统 源码 毕业设计 选题推荐 毕设选题 数据分析 机器学习 深度学习
大数据·python·数据分析·spark·毕业设计·课程设计·ai就业收入
小猴子爱上树6 小时前
跨马翻译:批量图片翻译与视频字幕、智能抠图一站式在线图片翻译工具
大数据·人工智能·python·音视频
W***25926 小时前
2026 企业 AI 办公工具选型指南:能力评估与平台全景分析
大数据·人工智能
2601_967212727 小时前
电源轨道系统核心技术路线对比与选型要点
大数据·经验分享
海绵宝宝转agent7 小时前
leetCode100算法开源笔记分享
笔记·算法
写后端的胖头鱼7 小时前
时间复杂度 & 空间复杂度
java·数据结构·算法·时间复杂度·空间复杂度
hahaha60167 小时前
黑体轨迹和色温--光源白点
人工智能·嵌入式硬件·算法·计算机视觉