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

重点是空间复杂度限制为常数.

人家想法:

用 matrix 的第0行和第0列的元素分别记录所对应的行和列是否有0.

A[0][0]比较特殊,我们只让它记录第0行的情况,声明另一变量col0记录第0列的情况.

我的实现代码较长,但思路表达的相当清楚.人家也有贼短的代码,人家很牛逼.

算法分两大阶段(细分为 8 steps, 在程序注释中所示)

  1. 设置第0行,第0列以及col0,让它们正确表达所对应行、列的状态;
  2. 依据上述状态将对应行、列置0.

第一第二阶段均需注意顺序,如程序中注释所示.

第二阶段清0时,如下图:

^ 表示第0行或第0列的元素;
* 表示非0行,非0列元素
依据状态置0时,先清非第0行和第0列的元素,那就是 * 表示的那帮货!
再清第0行,最后依据col0清第0列. ^ ^ ^
^ * *
^ * *

有意思的是:col0展示了她的重要地位,她已跳出三界外,不在五行中.整个程序从她而起,最后又由她而终!

自己代码和注释:

\(O(n^2)\) time, \(O(1)\) space.

void setZeroes(vector<vector<int>>& A) {
// 程序分为8个step, 各step顺序不能颠倒
// 终极目的是避免记录状态的第0行和第0列被误写
int m = A.size(), n = A[0].size(), col0 = 1; // step1. 若第0列有0, col0 = 0
for (int i = 0; i < m; i++)
if (A[i][0] == 0) {
col0 = 0;
break;
} // step2. 若第0行有0, row0 = 0
for (int j = 0; j < n; j++)
if (A[0][j] == 0) {
A[0][0] = 0;
break;
} // step3. 依次检查除第0列以外的其他列j,若那列有0,则A[0][j]=0
for (int j = 1; j < n; j++)
for (int i = 0; i < m; i++)
if (A[i][j] == 0) {
A[0][j] = 0;
break;
} // step4. 依次检查除第0行以外的其他行i,若那行有0,则A[i][0]=0
for (int i = 1; i < m; i++)
for (int j = 0; j < n; j++)
if (A[i][j] == 0) {
A[i][0] = 0;
break;
} // 阶段性胜利:到此为止,我们把第0行与第0列,以及col0的 state 设置完成了
// 接下来,我们要根据上述状态,将对应元素设置为0 // step5. 依据第0列,修改第1~(m-1)行元素为0(注意:不改第0行,因为那里存着state)
for (int i = 1; i < m; i++)
if (A[i][0] == 0)
for (int j = 1; j < n; j++)
A[i][j] = 0; // step6. 依据第0行,修改第1~(n-1)列元素为0(注意:不改第0列,因为那里存着state)
for (int j = 1; j < n; j++)
if (A[0][j] == 0)
for (int i = 1; i < m; i++)
A[i][j] = 0; // step7. 按照A[0][0], 修改第0行元素为0
if (A[0][0] == 0)
for (int j = 1; j < n; j++)
A[0][j] = 0; // step8. 按照col0, 修改第0列元素为0, 再次强调, 以上次序不能调换
if (col0 == 0)
for (int i = 0; i < m; i++) //此时需将A[0][0]元素包含在内
A[i][0] = 0;
}

73. Set Matrix Zeroes(中等)的更多相关文章

  1. 【LeetCode】73. Set Matrix Zeroes (2 solutions)

    Set Matrix Zeroes Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do i ...

  2. 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. Fo ...

  3. Leetcode#73 Set Matrix Zeroes

    原题地址 用矩形的第一行和第一列充当mask 代码: void setZeroes(vector<vector<int> > &matrix) { ].empty()) ...

  4. [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 ...

  5. leetcode[73] Set Matrix Zeroes 将矩阵置零

    给定一个矩阵,把零值所在的行和列都置为零.例如: 1 2 3 1 3 1 1 1 操作之后变为 1 3 0 0 0 1 1 方法1: 赋值另存一个m*n的矩阵,在原矩阵为零的值相应置新的矩阵行和列为零 ...

  6. LeetCode OJ 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. click ...

  7. 【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. Fo ...

  8. 【一天一道LeetCode】#73. Set Matrix Zeroes

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...

  9. 73. Set Matrix Zeroes 把矩阵同一行列的元素都改成0

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

随机推荐

  1. RSA的公钥、私钥

    一.举个例子 1.发消息 用对方的公钥给对方发消息 2.发公告 发公告的时候,用自己的私钥形成签名! 二.加密和签名 RSA的公钥.私钥是互相对应的,RSA会生成两个密钥,你可以把任何一个用于公钥,然 ...

  2. groovy入门(2-1)Groovy的Maven插件安装:Plugin execution not covered by lifecycle configuration

    参考链接:http://www.cnblogs.com/rightmin/p/4945797.html 1.引入groovy的jar包 2.引入groovy编译插件 3.遇到问题 Plugin exe ...

  3. Spark入门(1-2)Spark的特点、生态系统和技术架构

    一.Spark的特点 Spark特性 Spark通过在数据处理过程中成本更低的洗牌(Shuffle)方式,将MapReduce提升到一个更高的层次.利用内存数据存储和接近实时的处理能力,Spark比其 ...

  4. JSON(三)——java中对于JSON格式数据的解析之json-lib与jackson

    java中对于JSON格式数据的操作,主要是json格式字符串与JavaBean之间的相互转换.java中能够解析JSON格式数据的框架有很多,比如json-lib,jackson,阿里巴巴的fast ...

  5. 详解Ajax请求(一)前言——同步请求的原理

    我们知道,ajax是一种异步请求的方式,想要了解异步请求,就必须要先从同步请求说起.常见的同步请求的方式是form表单的提交,我们先从一种同步请求的示例说起. 我们希望输入姓名可以从后台得到身份证号. ...

  6. GET和POST两种基本请求方法的区别

    文章来源:http://www.cnblogs.com/logsharing/p/8448446.html GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一 ...

  7. JavaScript的基础学习

    由js和python想到的: 弱类型语言 js 中的数据在进行算数运算时,会自动转换类型强类型语言 变量的值的数据类型一旦确定,使用时不能改变 动态语言:编译时不知道数据类型,只有在执行时才知道数据类 ...

  8. Hive:添加、删除分区

    添加分区: ', p_loctype='MHA'); 已经创建好的分区表: INFO : Loading partition {p_hour, p_city, p_loctype=MHA} INFO ...

  9. [Debug]测试环境Giraffe无法正确登录

    BUG描述: 在测试环境192.168.2.72上的giraffe无法正确登录,输入正确的用户名.密码,点击登录无反应,输入错误的用户名密码会报错 原因: 2.72安装giraffe的磁盘空间已满,导 ...

  10. canvas图像模糊以及图像变形问题

    问题:有时用canvas作图时发现图像会出现模糊不清晰的问题,甚至做出来的图呈现出的效果与我们给的数值所应该呈现出的效果不一致 原因:当你在支持html5 canvas的浏览器下查看页面的时候,can ...