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. SpringCloud的Config:ConfigServer注册到EurekaServer中,变成一个Eureka服务

    一.概念与定义 1.将SpringCloud ConfigServer注册到 EurekaServer,以便ConfigClient以服务的方式引用ConfigServer 2.客户端不再引用 Con ...

  2. [机器学习Lesson3] 梯度下降算法

    1. Gradient Descent(梯度下降) 梯度下降算法是很常用的算法,可以将代价函数J最小化.它不仅被用在线性回归上,也被广泛应用于机器学习领域中的众多领域. 1.1 线性回归问题应用 我们 ...

  3. RxJava系列1(简介)

    RxJava系列1(简介) RxJava系列2(基本概念及使用介绍) RxJava系列3(转换操作符) RxJava系列4(过滤操作符) RxJava系列5(组合操作符) RxJava系列6(从微观角 ...

  4. pandas.read_csv参数详解

    读取CSV(逗号分割)文件到DataFrame 也支持文件的部分导入和选择迭代 更多帮助参见:http://pandas.pydata.org/pandas-docs/stable/io.html 参 ...

  5. web框架之Flask

    Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请求并对请求进行预处理,然后 ...

  6. Git撤销commit消息保留修改

    有时候commit后发现commit信息错了或者是添加了不想commit的内容,但还没有push到远程仓库 这个时候 git reset --soft [commit_id] 就可以回滚到某一个com ...

  7. Struts(十):OGNL表达式(一)

    Struts2 用s:porperty标签和OGNL表达式来读取值栈中的属性值: I.值栈中的属性值: 1.对象栈:读取对象栈中的某一个对象的属性值: 2.Map栈 :request,session, ...

  8. 07、NetCore2.0依赖注入(DI)之生命周期

    07.NetCore2.0依赖注入(DI)之生命周期 NetCore2.0依赖注入框架(DI)是如何管理注入对象的生命周期的?生命周期有哪几类,又是在哪些场景下应用的呢? -------------- ...

  9. Ubuntu16.04系统下 解决“无法获得锁 /var/lib/dpkg/lock -open (11:资源暂时不可用)、无法锁定管理目录(/var/lib/dpkg/),是否有其他进程正占用它?”的方法

    在Ubuntu16.04下安装软件,例如:sudo apt-get install lrzsz时提示: 无法获得锁 /var/lib/dpkg/lock - open (11: 资源暂时不可用) 无法 ...

  10. MyBatis 框架系列之基础初始

    1.什么是 MyBatis MyBatis 本是 apache 的一个开源项目 iBatis,后改名为 MyBatis,它 是一个优秀的持久层框架,对 jdbc 的操作数据库的过程进行封装,使开发者只 ...