矩阵----=矩阵置零

🔥个人主页: 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]]
相关推荐
Navigator_Z5 小时前
LeetCode //C - 1206. Design Skiplist
c语言·算法·leetcode
码行山野赴时序归途5 小时前
三道经典数组题:从暴力到最优的算法思维
c语言·开发语言·数据结构·算法·leetcode
徐小夕6 小时前
3分钟从想法到Agent上线:我们开源了一款AI可视化工作流“IDE”
前端·算法·github
星野川崎2066 小时前
电商多店运维:云机24小时挂机频繁掉线、账号无故风控深度原因分析及解决方案
大数据·运维·服务器·云计算·电商
2601_967097226 小时前
园区巡检机器人推荐:4项评估维度与主流产品横评
大数据·人工智能·信息可视化
sel_97 小时前
【强化学习】Hands-on Modern RL项目实践|OPD 算法完整解析
人工智能·深度学习·算法·机器学习·语言模型
whcyhhh7 小时前
头歌实践教学平台:大数据存储2023(六)
大数据·数据库·python
世岩清上7 小时前
新能源宣传片怎么拍?如何用画面讲好你的绿色能源故事
大数据·人工智能·能源·宣传片·宣传片拍摄
Navigator_Z7 小时前
LeetCode //C - 1209. Remove All Adjacent Duplicates in String II
c语言·算法·leetcode