[力扣 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;
    }
};
相关推荐
TT编程2 分钟前
力扣(leetcode)题目总结——动态规划篇
c++·leetcode·面试·动态规划
SuhyOvO19 分钟前
std::sort的底层原理(混合排序算法)
c++·算法·stl·排序算法
licy__20 分钟前
python常用的排序算法
python·算法·排序算法
行码棋22 分钟前
【机器学习】决策树算法原理详解
算法·决策树·机器学习
卷卷的小趴菜学编程24 分钟前
类和对象(中)
java·c语言·开发语言·数据结构·c++·算法·链表
不打灰的小刘39 分钟前
基于自动反馈的大语言模型纠错策略综述
人工智能·算法·语言模型·chatgpt
dbln1 小时前
动态规划——完全背包问题
算法·动态规划
浅念同学1 小时前
算法.图论-习题全集(Updating)
java·算法·leetcode·图论
琴鸣天下1 小时前
DAY66||Floyd 算法精讲 |A * 算法精讲 (A star算法)|最短路算法总结篇|图论总结
算法·图论
IT猿手1 小时前
多目标优化算法:多目标红嘴蓝鹊优化算法(MORBMO)求解UF1-UF10,提供完整MATLAB代码
开发语言·人工智能·算法·数学建模·matlab·智能优化算法