[力扣 Hot100]Day18 矩阵置零

题目描述

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

出处

思路

在原数组上直接操作势必会出现"冗余"的0,即原本[i,j]处不是0,例如由于i行的其他位置有0导致[i,j]处被置0,从而j列本来没有0却被置0。因此需要辅助数组来存储需要被置0的位置,在遍历后再秋后算账。朴素的想法就是空间复杂度O(mn),优化一下只存行号和列号就是O(m+n),再优化就可以直接用矩阵的第0行和第0列来充当辅助数组,复杂度O(1),但需要注意的是一开始要避开第0行和第0列,以免辅助数组中出现"冗余"的0。

代码

cpp 复制代码
class Solution {
public:
    void setZeroes(vector<vector<int>>& matrix) {
        int m=matrix.size();
        int n=matrix[0].size();
        int i,j;
        bool flag_m=false,flag_n=false;
        for(i=0;i<m;i++)
            if(matrix[i][0]==0)
                flag_n=true;//检测原始第一列是否应置为0
        for(j=0;j<n;j++)
            if(matrix[0][j]==0)
                flag_m=true;//检测原始第一行是否应置为0
        for(i=0; i<m;i++){
            for(j=0; j<n;j++){
                if(matrix[i][j]==0){
                    matrix[0][j]=0;
                    matrix[i][0]=0;
                }
            }
        }
        for(i=1; i<m;i++){//先避开第一行
            if(matrix[i][0]==0){
                for(j=1; j<n;j++){
                    matrix[i][j]=0;
                }
            }
        }
        for(j=1; j<n; j++){//先避开第一列
            if(matrix[0][j]==0){
                for(i=1; i<m; i++){
                    matrix[i][j]=0;
                }
            }
        }
        if(flag_m)
            for(j=0; j<n;j++)
                matrix[0][j]=0;
        if(flag_n)
            for(i=0;i<m;i++)
                matrix[i][0]=0;
    }
};
相关推荐
暮冬-  Gentle°5 分钟前
C++中的工厂方法模式
开发语言·c++·算法
沐硕12 分钟前
《基于改进协同过滤与多目标优化的健康饮食推荐系统设计与实现》
java·python·算法·fastapi·多目标优化·饮食推荐·改进协同过滤
Z9fish17 分钟前
sse哈工大C语言编程练习47
c语言·数据结构·算法
nglff24 分钟前
蓝桥杯抱佛脚第一天|简单模拟,set,map的使用
算法·职场和发展·蓝桥杯
仟濹30 分钟前
【算法打卡day27(2026-03-19 周四)】蓝桥云课中Lv.1难度中的绝大部分题
算法·蓝桥杯
罗湖老棍子36 分钟前
滑动窗口与双调队列:幕布覆盖问题(定右缩左满分板子)改编自LeetCode 1438
算法·滑动窗口·单调队列
CoovallyAIHub40 分钟前
ICLR 2026 | MedAgent-Pro:用 Agent 工作流模拟临床医生的循证诊断过程
深度学习·算法·计算机视觉
实心儿儿41 分钟前
算法7:两个数组的交集
算法·leetcode·职场和发展
我可能是个假开发41 分钟前
算法-回溯
算法
WolfGang00732141 分钟前
代码随想录算法训练营 Day14 | 二叉树 part04
数据结构·算法