18 矩阵置0

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

示例 1:

复制代码
输入:matrix = [[1,1,1],[1,0,1],[1,1,1]]
输出:[[1,0,1],[0,0,0],[1,0,1]]

示例 2:

复制代码
输入:matrix = [[0,1,2,0],[3,4,5,2],[1,3,1,5]]
输出:[[0,0,0,0],[0,4,5,0],[0,3,1,0]]

提示:

  • m == matrix.length
  • n == matrix[0].length
  • 1 <= m, n <= 200
  • -231 <= matrix[i][j] <= 231 - 1

进阶:

  • 一个直观的解决方案是使用 O(m n) 的额外空间,但这并不是一个好的解决方案。
  • 一个简单的改进方案是使用 O(m +n) 的额外空间,但这仍然不是最好的解决方案。
  • 你能想出一个仅使用常量空间的解决方案吗?
思路1

1、先判断一下参数是否合法

2、创建一个vector<pair<int,int> > line用于存放数字为0的行和列

3、循环一遍矩阵,记录零的个数,并将行和列存放在line中

4、循环line数组,将里面的行和列取出,将对应的行列置0;

cpp 复制代码
    void setZeroes(vector<vector<int>>& matrix) {
    int m=matrix.size();
  	if(0==m) return;
    int n=matrix[0].size();
    if(0==n) return;
    vector <pair<int,int >> line_col; //记录行和列
    for(int i=0;i<m;i++){
        if(matrix[i].size()!=n) return;  //非矩阵的标准
        for(int j=0;j<n;j++){
            if(0==matrix[i][j]) line_col.push_back({i,j});  //{列,行}
        }
    }

    int size=line_col.size();
    cout<<"size:"<<size<<endl;
    for(int i=0;i<size;i++){
        int line_m=line_col[i].first;
        int line_n=line_col[i].second;
        for(int j=0;j<n;j++){
            //cout<<"j:"<<j<<"  line_m:"<<line_m<<endl;
            matrix[line_m][j]=0;
        }

        for(int k=0;k<m;k++){
            //cout<<"i:"<<i<<"  line_n:"<<line_n<<endl;
            matrix[k][line_n]=0;
        }

    }
    return ;
}
思路2,不用额外的空间

1、先循环一遍二维数组,标记数字为0的位置为一个大数(99923453)

2、再循环一次,找到大数(99923453)时,将此位置的行和列都置零

3、置零钱要判断所在位置不等于大数(99923453),才置零,否则跳过

4、最后将当前位置置零

cpp 复制代码
class Solution {
public:
    void setZeroes(vector<vector<int>>& matrix) {
        int m=matrix.size();
        if(m==0) return;
        int n=matrix[0].size();
        if(n==0) return;
        vector<pair<int,int> > ans;
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(matrix[i][j]==0){
                    matrix[i][j]=-INT_MAX+1;
                }
            }
        }

        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(matrix[i][j]==-INT_MAX+1){
                    for(int k=0;k<m;k++){
                        if(matrix[k][j]!=-INT_MAX+1)
                        matrix[k][j]=0;
                    }
                    for(int k=0;k<n;k++){
                        if(matrix[i][k]!=-INT_MAX+1)
                        matrix[i][k]=0;
                    }
                    matrix[i][j]=0;
                }
            }
        }
    }
};

推荐一个零声教育学习教程,个人觉得老师讲得不错,分享给大家:[Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,点击立即学习:链接

相关推荐
aramae3 小时前
MySQL复合查询(8)
java·c语言·开发语言·后端·算法
荆棘鸟智能3 小时前
城市感知设备怎么统一接入?从多协议网关到设备模型的中间件架构设计
人工智能·算法·边缘计算
INGNIGHT7 小时前
270 · 电话号码的字母组合II(Trie)
linux·算法
2401_839080547 小时前
C++常见八股
数据结构·c++·算法
青山是哪个青山8 小时前
LeetCode 188:买卖股票的最佳时机 IV
算法
mikuyyds8 小时前
geo-toolbox 插件算法解析:RUSLE 与 MUSLE 的工程化落地
算法·rust·gis
a187927218318 小时前
【算法】树(二):队列与祖先——BFS 骨架三配件、短路透传与合流
算法·leetcode·二叉树··bfs·算法讲解·树遍历
syagain_zsx8 小时前
算法基础篇 · 03 枚举(C++ 题解)
c++·算法·二进制·枚举
weixin_307779139 小时前
C++代码实现MATLAB中的ode23tb函数功能
开发语言·c++·算法·matlab
我是章汕呐10 小时前
地级市能源消耗量及消耗强度数据【2006-2023年】平衡面板
人工智能·经验分享·算法·回归