leetcode hot100刷题日记——9.矩阵置零


解答一:

cpp 复制代码
class Solution {
public:
    void setZeroes(vector<vector<int>>& matrix) {
        //O(mn)额外空间,直白思想:找个和matrix一样形状的数组做vis标记数组
        //如果遇到了0,那就vis[i][j]=1,表明这个数组位置已经被用过了
        //不会出现:如示例1中,遍历到第二行第二列0时,把第二行和第二列所有数字变成0
        //下一个遍历第二行第三列,已经在上一步中变成0了
        //你要是不做标记,那也会把第三列所有数变成0,那就错了
        //但是,注意示例2又提醒了我们另一种情况
        //当两个0在同一行时候,如果你在遍历到第二个0的时候,vis是1
        //那么他就会跳过这个0,不把第四列变成0了
        //所以在进行vis更新前,我们需要判断一下这个数是不是原本就是0
        //如果原本就是0的话,vis就依旧是0
        int m=matrix.size();
        int n=matrix[0].size();
        vector<vector<int>> vis(m,vector<int>(n));
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(matrix[i][j]==0&&vis[i][j]==0){
                    for(int k=0;k<n;k++){
                        if(matrix[i][k]!=0){
                            vis[i][k]=1;
                        }
                        matrix[i][k]=0; 
                    }
                    for(int k=0;k<m;k++){
                        if(matrix[k][j]!=0){
                            vis[k][j]=1;
                        }
                        matrix[k][j]=0;
                    }
                }
            }
        }
        return;
    }
};

时间复杂度:O(mn)

空间复杂度:O(mn)

解答二:

cpp 复制代码
class Solution {
public:
    void setZeroes(vector<vector<int>>& matrix) {
        //O(m+n)额外空间:一个数组存行位置,一个数组存列位置
        int mm=matrix.size();
        int nn=matrix[0].size();
        vector<int> m(mm);
        vector<int> n(nn);
        for(int i=0;i<mm;i++){
            for(int j=0;j<nn;j++){
                //把所有是0的数的行位置和列位置记录下来
                if(matrix[i][j]==0){
                    m[i]=n[j]=1;
                }
            }
        }
        for(int i=0;i<mm;i++){
            for(int j=0;j<nn;j++){
                if(m[i]!=0||n[j]!=0){
                    //只要行有0或者列有0就直接变0
                    matrix[i][j]=0;
                }
            }
        }
       
    }
};

时间复杂度:O(mn)

空间复杂度:O(m+n)

相关推荐
海清河晏1113 小时前
数据结构 | 单循环链表
数据结构·算法·链表
wuweijianlove7 小时前
算法性能的渐近与非渐近行为对比的技术4
算法
_dindong7 小时前
cf1091div2 C.Grid Covering(数论)
c++·算法
AI成长日志7 小时前
【Agentic RL】1.1 什么是Agentic RL:从传统RL到智能体学习
人工智能·学习·算法
黎阳之光8 小时前
黎阳之光:视频孪生领跑者,铸就中国数字科技全球竞争力
大数据·人工智能·算法·安全·数字孪生
skywalker_118 小时前
力扣hot100-3(最长连续序列),4(移动零)
数据结构·算法·leetcode
6Hzlia8 小时前
【Hot 100 刷题计划】 LeetCode 17. 电话号码的字母组合 | C++ 回溯算法经典模板
c++·算法·leetcode
wfbcg8 小时前
每日算法练习:LeetCode 209. 长度最小的子数组 ✅
算法·leetcode·职场和发展
_日拱一卒9 小时前
LeetCode:除了自身以外数组的乘积
数据结构·算法·leetcode
计算机安禾9 小时前
【数据结构与算法】第36篇:排序大总结:稳定性、时间复杂度与适用场景
c语言·数据结构·c++·算法·链表·线性回归·visual studio