leetcode第一刷_Set Matrix Zeroes
2016-02-01 11:49
253 查看
这个题乍一看非常easy,实际上还挺有技巧的。我最開始的想法是找一个特殊值标记。遇到一个0,把他所相应的行列中非零的元素标记成这个特殊值。0值保持不变,然后再从头遍历一次,碰到特殊值就转化成0。
问题是这个特殊值怎么确定,题目中没有把取值范围给出,我怀着侥幸的心理用了最大和最小的int,都被揪了出来。。假设找一个不存在于数组中的值,这个复杂度太高了。
有没有其它更好的方法呢?当然有。这个思想非常巧妙,最后的结果是把所有0所在的行列都化成0,换句话说。化成0这个事情仅仅要标记出是哪一行以及哪一列就能够了。能不能找到一种标记的方式来完毕这个事情呢?做法是假设扫描到一个0。我们就把这个数的行列第一个数值置成0,用来做标记位,等所有扫描完毕后,针对为第一行和第一列为0的那些行列,置成0就能够了。
有一个细节,第一行和第一列该怎么办,他们可能一開始并没有0,由于标记的原因有0了。怎么区分呢?处理方式事实上非常easy,一開始先看一下它含不含0。然后在最后依据这个结果来决定要不要把他们变成0.
问题是这个特殊值怎么确定,题目中没有把取值范围给出,我怀着侥幸的心理用了最大和最小的int,都被揪了出来。。假设找一个不存在于数组中的值,这个复杂度太高了。
有没有其它更好的方法呢?当然有。这个思想非常巧妙,最后的结果是把所有0所在的行列都化成0,换句话说。化成0这个事情仅仅要标记出是哪一行以及哪一列就能够了。能不能找到一种标记的方式来完毕这个事情呢?做法是假设扫描到一个0。我们就把这个数的行列第一个数值置成0,用来做标记位,等所有扫描完毕后,针对为第一行和第一列为0的那些行列,置成0就能够了。
有一个细节,第一行和第一列该怎么办,他们可能一開始并没有0,由于标记的原因有0了。怎么区分呢?处理方式事实上非常easy,一開始先看一下它含不含0。然后在最后依据这个结果来决定要不要把他们变成0.
class Solution { public: void setZeroes(vector<vector<int> > &matrix) { int row = matrix.size(), column = matrix[0].size(); bool firstRow = false, firstColumn = false; for(int i=0;i<row;i++) if(matrix[i][0] == 0){ firstColumn = true; break; } for(int i=0;i<column;i++) if(matrix[0][i] == 0){ firstRow = true; break; } for(int i=1;i<row;i++){ for(int j=1;j<column;j++){ if(matrix[i][j] == 0){ matrix[i][0] = 0; matrix[0][j] = 0; } } } for(int i=1;i<row;i++){ for(int j=1;j<column;j++){ if(matrix[i][0] == 0 || matrix[0][j] == 0) matrix[i][j] = 0; } } if(firstRow){ for(int i=0;i<column;i++) matrix[0][i] = 0; } if(firstColumn){ for(int i=0;i<row;i++) matrix[i][0] = 0; } } };
相关文章推荐
- iOSCoreAnimation CABasicAnimation 详解
- Unity3d中BlinnPhong光照模型注解
- BLE-NRF51822教程5-静态密码设置
- C++开发ActiveX控件相关
- 数据保护API
- 高逼格UI-ASD(Android Support Design)
- JSP与Servlet的介绍说明
- 心然-心之所在,浮生安然
- 北美IT公司大致分档
- iOS开源库大集合
- 灵境
- Reading Files
- 设置mysql允许外部IP访问
- 吴晓波领衔“大头频道”音频版独家入驻喜马拉雅FM意欲何为?
- wes开发笔记
- 溯源之梦回秦淮
- is 与 as
- MySQL的事务隔离级别
- TBB介绍
- source insight打不开