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等技术内容,点击立即学习:链接

相关推荐
地平线开发者2 小时前
【模型轻量化专题】衡量模型轻量性的指标
算法
学习星球5 小时前
OFDM技术精讲:正交性推导、循环前缀原理与80行Python链路仿真(附实测数据)
算法·面试·前端框架
alphaTao11 小时前
LeetCode 每日一题 2026/8/24-2026/8/30
python·算法·leetcode
Interview Aid11211 小时前
TikTok OA 四题分享|半小时内 AC,题目基本都是实现题
java·开发语言·算法·面试·职场和发展
AI_yangxi13 小时前
短视频矩阵系统选哪家
大数据·人工智能·矩阵
顶点多余21 小时前
那些在算法中适合巩固的知识点---1
java·前端·算法
罗西的思考1 天前
【Agentic RL / 强化学习框架】Molt 设计解读
人工智能·算法·机器学习
hahaha60161 天前
HLS高层次综合设计技巧--C++类和模板
图像处理·人工智能·算法·计算机视觉
多弗朗皮卡丘1 天前
算法详解4:买卖股票的最佳时机系列(上)
算法
维克兜率天1 天前
【维克】动量指标家族:RSI、ROC、CCI、Momentum全面解析
python·算法