leetcode || 73、Set Matrix Zeroes

problem:

Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place.

click to show follow up.

Follow up:

Did you use extra space?

A straight forward solution using O(mn) space is probably a bad idea.

A simple improvement uses O(m + n) space, but still not the best solution.

Could you devise a constant space solution?

Hide Tags

Array

题意:矩阵出现0,则将改行和该列置0,注意不要讲矩阵全部置0

thinking:

(1)这道题的实现不难,难在怎么样控制空间复杂度

(2)空间复杂度为O(m*n)的方法不谈,太简单了。空间复杂度为O(m+n)的方法也容易实现,单独开两个数组记录行和列

(3)重点介绍 空间复杂度为 O(1)的方法:

这里只使用两个BOOL  变量即可搞定

1、bool  flag_row、 flag_col分别记录首行和首列是否有0

2、从第二行和第二列开始遍历,如果出现0,则将首行和首列的对应位置 置0

3、2第二步完成之后,也是从第二行和第二列开始根据首行和首列信息填充0;

4、根据第一步的信息填充首行和首列

该方法是利用首行和首列来保存信息,注意首行和首列要单独处理。

code:

class Solution {
public:
    void setZeroes(vector<vector<int> > &matrix) {
        if(matrix.size()==0)
            return;
       int m=matrix.size();
       int n=matrix[0].size();
       bool flag_row=false;
       bool flag_col=false;
       /*先考虑单列或者单行的特殊情况*/
       if(m==1)
       {
           bool flag=false;
           for(int i=0;i<n;i++)
               if(matrix[0][i]==0)
                   flag=true;
           if(flag)
           {
                for(int i=0;i<n;i++)
                    matrix[0][i]=0;
           }
           return;
       }//m==1
       if(n==1)
       {
           bool flag=false;
           for(int i=0;i<m;i++)
               if(matrix[i][0]==0)
                   flag=true;
           if(flag)
           {
                for(int i=0;i<m;i++)
                    matrix[i][0]=0;
           }
           return;
       }//n==1

       for(int i=0;i<m;i++)//第一列是否有0,记录
       {
           if(matrix[i][0]==0)
           {
                flag_col=true;
                break;
           }
       }
       for(int j=0;j<n;j++)//第一行是否有0,记录
       {
           if(matrix[0][j]==0)
           {
                flag_row=true;
                break;
           }
       }
       for(int i=1;i<m;i++)  //从第二行第二列开始,如果出现0,将第一行和第一列的对应位置置0
           for(int j=1;j<n;j++)
           {
               if(matrix[i][j]==0)
               {
                   matrix[0][j]=0;
                   matrix[i][0]=0;
               }
           }
       for(int i=1;i<m;i++)//逐行检查置0
       {
           if(matrix[i][0]==0)
           {
               for(int j=1;j<n;j++)//从第二列开始
                   matrix[i][j]=0;
           }
       }
       for(int j=1;j<n;j++)//逐列检查,从第二行开始
       {
           if(matrix[0][j]==0)
           {
               for(int i=1;i<m;i++)
                   matrix[i][j]=0;
           }
       }

       if(flag_col)  //检查第一列
       {
           for(int i=0;i<m;i++)
               matrix[i][0]=0;
       }
       if(flag_row)  //检查第一行
       {
           for(int j=0;j<n;j++)
               matrix[0][j]=0;
       }
    }
};
时间: 2024-10-12 20:57:37

leetcode || 73、Set Matrix Zeroes的相关文章

LeetCode 第 73 题 (Set Matrix Zeroes)

LeetCode 第 73 题 (Set Matrix Zeroes) Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place. Follow up: Did you use extra space? A straight forward solution using O(mn) space is probably a bad idea. A simple impro

leetcode第一刷_Set Matrix Zeroes

这个题乍一看很简单,实际上还挺有技巧的.我最开始的想法是找一个特殊值标记,遇到一个0,把他所对应的行列中非零的元素标记成这个特殊值,0值保持不变,然后再从头遍历一次,碰到特殊值就转化成0. 问题是这个特殊值怎么确定,题目中没有把取值范围给出,我怀着侥幸的心理用了最大和最小的int,都被揪了出来..如果找一个不存在于数组中的值,这个复杂度太高了. 有没有其他更好的方法呢?当然有.这个思想很巧妙,最后的结果是把所有0所在的行列都化成0,换句话说,化成0这个事情只要标记出是哪一行以及哪一列就可以了,能

Leetcode 细节实现 Set Matrix Zeroes

Set Matrix Zeroes Total Accepted: 18139 Total Submissions: 58671My Submissions Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place. click to show follow up. 题意:给定矩阵,如果矩阵的某个位置为0,则把那一行那一列的所有元素都置为0 思路:用两个bool数组,分

leetcode笔记:Set Matrix Zeroes

一.题目描述 Given a m*n matrix, if an element is 0, set its entire row and column to 0. Do it in place. Follow up: Did you use extra space? A straight forward solution using O(mn) space is probably a bad idea. A simple improvement uses O(m + n) space, but

LeetCode:Set Matrix Zeroes - 将矩阵内含有零的行和列全部置零

1.题目名称 Set Matrix Zeroes(将矩阵内含有零的行和列全部置零) 2.题目地址 https://leetcode.com/problems/set-matrix-zeroes/ 3.题目内容 英文:Given a m x n matrix, if an element is 0, set its entire row and column to 0. 中文:给定一个m×n的矩阵,如果其中一个元素是0,则将该元素所在的整行或整理全部置为0 4.解题方法1 使用第一行和第一列记录某

73. Set Matrix Zeroes &amp;&amp; 289. Game of Life

73. Set Matrix Zeroes Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place. Hide Tags Array Hide Similar Problems (M) Game of Life public class Solution { //Only consider the zeros that exist originally. public

【leetcode刷题笔记】Set Matrix Zeroes

Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place. 题解:因为题目要求原地算法,所以我们只能利用矩阵第一行和第一列存放置零信息. 首先遍历第一行和第一列,看他们是否需要全部置零,用两个变量first_column_zero和first_row_zero来记录: 遍历矩阵,如果某个位置matrix[i][j]出现了0,就把matrix[i][0]和Matrix[0

Set Matrix Zeroes leetcode java

题目: Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place. click to show follow up. Follow up: Did you use extra space? A straight forward solution using O(mn) space is probably a bad idea. A simple improvement

LeetCode: Set Matrix Zeroes [073]

[题目] Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place. [题意] 给定一个mXn的矩阵,如果其中的元素为0,则对应的行和列都用0填充. 不能申请额外的空间. [思路] 第一行和第一列空出来标记需要置0的列和行 第一遍扫描: 扫描第一行,判断第一行是否需要清零 扫描第一列,判断第一列是否需要清零 扫描[1,1]~[m-1, n-1]的区块,如果某个位置上的值