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

相关推荐
Forever Nore3 小时前
学完C语言力扣第一题做不来正常吗
数据结构·算法
hansang_IR3 小时前
【题解】LC:倍增 / 区间并查集(Range Parallel Unionfind)
c++·算法·并查集
Tisfy5 小时前
LeetCode 3731.找出缺失的元素:哈希 / 排序
算法·leetcode·哈希算法·排序·哈希表
lucas_AI5 小时前
Q-CueGraph:你的多模态大模型会 zoom,但真的知道该看哪儿吗?
人工智能·算法
kaixin_啊啊5 小时前
test_机器学习算法学习
学习·算法·机器学习
liulilittle5 小时前
MOE路由:路由(logits: top-k/8)
c++·人工智能·算法·机器学习·llm
旖旎夜光5 小时前
LeetCode 11:盛最多水的容器(双指针问题) —— 题解
数据结构·c++·算法·leetcode·双指针
一只齐刘海的猫6 小时前
【Leetcode】乘积最大子数组
算法·leetcode·职场和发展
余生皆假期-7 小时前
傅里叶变换和拉普拉斯变换
人工智能·算法·机器学习
数模竞赛Paid answer8 小时前
2026年五一杯数学建模C题边坡预警问题求解全过程文档及程序
算法·数学建模·五一杯