LeetCode 73.矩阵置零

97 阅读1分钟

从零开始学习c++,每天起码做一道leetcode题目,在此记录,希望最后能够有所收获!

一、题目描述

73.矩阵置零

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

示例 1:

image.png

输入: matrix = [[1,1,1],[1,0,1],[1,1,1]]
输出: [[1,0,1],[0,0,0],[1,0,1]]

示例 2:

image.png

输入: 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

二、思路分析

这一题还是没有做出来。我想到的就是暴力做法。先遍历一遍,把元素值为0的行和列记录上,遍历完之后再依次取出列号和行号。但这么做一个是要遍历的次数太多,另一个是放入的行号和列号需要区分,且可能会重复,这该怎么辨别。

看了答案,确实精妙。首先判断第一行和第一列是否需要被置零,然后遍历,遇到为0的元素,就把该元素所在的行和列的第一行和第一列置零,依此标记。

三、AC代码

class Solution {
public:
    void setZeroes(vector<vector<int>>& matrix) {
        vector<vector<int>>ans;
        bool row=false,col=false;
        for(int i=0;i<matrix.size();i++){
            if(matrix[i][0]==0){
                col=true;

            }
        }
        for(int i=0;i<matrix[0].size();i++){
            if(matrix[0][i]==0){
                row=true;
            }
        }
        for(int i=0;i<matrix.size();i++){
            for(int j=0;j<matrix[0].size();j++){
                if(matrix[i][j]==0){
                    matrix[i][0]=0;
                    matrix[0][j]=0;
                }
            }
        }
        for(int i=1;i<matrix.size();i++){
            for(int j=1;j<matrix[0].size();j++){
                if(matrix[i][0]==0||matrix[0][j]==0){
                    matrix[i][j]=0;
                    
                }
            }
        }
        if(row==true){
            
            for(int i=0;i<matrix[0].size();i++){
                matrix[0][i]=0;
           
            
        }
        }

        if(col==true){
            for(int i=0;i<matrix.size();i++){
                matrix[i][0]=0;

            }
        }
        
        

    }
};

四、总结

没做出来,暴力应该能做但是怕超时。