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

相关推荐
jidaowansui18 小时前
B3643 图的存储———>数组模拟邻接矩阵
算法
y1su18 小时前
Leetcode 二分模板
java·数据结构·算法·leetcode·排序算法
youshi666818 小时前
平衡车——PID算法优化
stm32·单片机·嵌入式硬件·算法·pid·平衡车
tigershang18 小时前
亲手拆开 Transformer:从手算入门到理论全景
神经网络·ai·矩阵·transformer
yeflx19 小时前
行列式、特征值、SVD 等知识点记录(待补充)
线性代数·矩阵
虾..19 小时前
三维图形学基础数学(向量,矩阵)
线性代数·矩阵
聪明蛋子哟19 小时前
不仅仅是向量检索:结合知识图谱与Tool Calling的混合增强生成(Hybrid RAG)方案
人工智能·算法·知识图谱
Pniubi19 小时前
力扣55跳跃游戏(贪心)
算法·leetcode·游戏
BSD_HY20 小时前
薄膜开关矩阵扫描在低功耗 MCU 上的 GPIO 扩展
单片机·嵌入式硬件·矩阵
jyyyx的算法博客20 小时前
传球游戏【思维】
算法