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.
重点是空间复杂度限制为常数.
人家想法:
用 matrix 的第0行和第0列的元素分别记录所对应的行和列是否有0.
A[0][0]比较特殊,我们只让它记录第0行的情况,声明另一变量col0记录第0列的情况.
我的实现代码较长,但思路表达的相当清楚.人家也有贼短的代码,人家很牛逼.
算法分两大阶段(细分为 8 steps, 在程序注释中所示)
- 设置第0行,第0列以及col0,让它们正确表达所对应行、列的状态;
- 依据上述状态将对应行、列置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(中等)的更多相关文章
- 【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 ...
- 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 ...
- Leetcode#73 Set Matrix Zeroes
原题地址 用矩形的第一行和第一列充当mask 代码: void setZeroes(vector<vector<int> > &matrix) { ].empty()) ...
- [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 ...
- leetcode[73] Set Matrix Zeroes 将矩阵置零
给定一个矩阵,把零值所在的行和列都置为零.例如: 1 2 3 1 3 1 1 1 操作之后变为 1 3 0 0 0 1 1 方法1: 赋值另存一个m*n的矩阵,在原矩阵为零的值相应置新的矩阵行和列为零 ...
- 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 ...
- 【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 ...
- 【一天一道LeetCode】#73. Set Matrix Zeroes
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...
- 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. ...
随机推荐
- eclipse开发Groovy代码,与java集成,maven打包编译
今天尝试了一下在eclipse里面写Groovy代码,并且做到和Java代码相互调用,折腾了一下把过程记录下来. 首先需要给eclipse安装一下Groovy的插件,插件地址:https://gith ...
- loadrunner录制时web时,安全证书问题
测试环境:win7+LoadRunner11+ie9 遇到的问题:用LoadRunner录制时,打开百度,总是报安全证书问题,如图所示 解决方法:Tools——Recording Options——p ...
- idea的spring boot项目,运行时不要显示在dashboard中
将对应项目的上图配置,取消勾选即可.
- Python实现简单的三级菜单
话不多说,直奔代码 # 要处理的字典 dic1 = { '北京': { '东城': { '沙河': ['沙河机场', '链家'], '天通苑': ['北方明珠', '天通尾货'] }, '朝阳': { ...
- java设计模式—— 工厂模式
菜鸡互啄... 工厂模式通过定义一个创建对象的接口,让其子类决定实例化哪个工厂类.因此我们要解决接口选择的问题,实现不同的计划创建不同的对象. 首先我们定义一个轿车接口 public interfac ...
- python Django之Ajax
python Django之Ajax AJAX,Asynchronous JavaScript and XML (异步的JavaScript和XML),一种创建交互式网页应用的网页开发技术方案. 异步 ...
- linux centos-7.2-64bit 安装配置启动nginx
1.安装依赖包yum -y install openssl openssl-develyum install pcre*yum install openssl*yum install zlib yum ...
- 1.4WEB API 路由配置及参数传输
在没有添加路由时,webapi 的访问比较恶心,访问的时候是没有接口方法的.如果定义了同样参数的方法,它就傻傻的分不清的,为了解决这个问题,我们加上路由吧. 这是生成的api帮助文档列表,可以看到下面 ...
- scrapy分布式的几个重点问题
我们之前的爬虫都是在同一台机器运行的,叫做单机爬虫.scrapy的经典架构图也是描述的单机架构.那么分布式爬虫架构实际上就是:由一台主机维护所有的爬取队列,每台从机的sheduler共享该队列,协同存 ...
- Vue mint ui用在消息页面上拉加载下拉刷新loadmore 标记
之前总结过一个页面存在多个下拉加载的处理方式,今天再来说一下在消息页面的上拉加载和下拉刷新,基本上每个app都会有消息页面,会遇到这个需求 需求:每次加载十条数据,上拉加载下拉刷新,并且没有点击查看过 ...