leetcode-Set Matrix Zeroes
2016-07-06 22:57
357 查看
leetcode-矩阵置零
之前趋势科技面试的时候遇到的题目:给定一个m*n的矩阵,将含有0的元素的对应行和列都置0
注意点:
- 本题的时间复杂度很难降低,因为矩阵必须要遍历一遍,所以时间复杂度是O(mn)
- 可以考虑空间复杂度的降低,即用最少的存储空间实现题意
- 参考了一些其他人的思路,觉得降低空间复杂度的最好方法就是把遇到的每一个0都放到其对应的行的第一列,以及其列的第一行(也就是把所有要置的0都放到矩阵的第一行的第一列)。这样做的好处是节省空间,并且不会影响后续的遍历置0的过程,因为0对应的行的第一列和列的第一行都是已经遍历过的了
易错点:
-是在遇到0的时候不能马上把对应的行和列置0,否则在后续遍历中会分不清是之前矩阵的0还是后续放置的0
我错的地方:
- 没有在原来的矩阵上进行数据操作导致了没有改变原矩阵的值(C++中指针和引用可以改变原来变量的值)
- 在写一个遍历语句的时候犯了一个逻辑错误,导致只有在满足条件的时候才执行本来必须执行的语句
题目代码如下:
class Solution { public: void setZeroes(vector<vector<int>>& matrix) { if(matrix.empty() != 1) { //代表列的临时变量 int col = 0; //1表示第一列不置0 bool isFirstRowZ = 1; for (vector<int>::iterator j = matrix[0].begin(); j != matrix[0].end(); j++) { //第一列置零 if (*j == 0 && isFirstRowZ != 0) { isFirstRowZ = 0; } } for (vector<vector<int> >::iterator i = matrix.begin() + 1; i != matrix.end(); i++) { for (vector<int>::iterator j = i -> begin(); j != i -> end(); j++) { //第一列置零 if (*j == 0 && (*i)[0] != 0) { (*i)[0] = 0; } //第一行置零 if (*j == 0 && matrix[0][col] != 0) { matrix[0][col] = 0; } ++col; } col = 0; } //根据第一行将矩阵置0 col = 1; for (vector<int>::iterator j = matrix[0].begin() + 1; j != matrix[0].end(); j++) { if (*j == 0) { for (vector<vector<int> >::iterator i = matrix.begin() + 1; i != matrix.end(); i++) { //列置0 (*i)[col] = 0; } } ++col; } //根据第一列将矩阵置0 for (vector<vector<int> >::iterator i = matrix.begin() + 1; i != matrix.end(); i++) { //行置0 if( (*i)[0] == 0) { for(vector<int>::iterator k = i->begin() + 1; k != i->end(); k++ ) { *k = 0; } } } //处理第一列 if (matrix[0][0] == 0) { for (vector<vector<int> >::iterator i = matrix.begin() + 1; i != matrix.end(); i++ ) { (*i)[0] = 0; } } //处理第一行 if (isFirstRowZ == 0) { for (vector<int>::iterator j = matrix[0].begin(); j != matrix[0].end(); j++) { *j = 0; } } } } };
相关文章推荐
- Redis 安装
- 剖析LRU算法及LinkedHashMap源码实现机制
- Java之WeakReference与SoftReference使用讲解
- ActivityLifecycle 生命周期
- 前景检测算法(五)--GMM,GMM2,GMG
- java冒泡排序和选择排序法
- Android &Swift iOS开发:语言与框架对比
- Redis 简介
- 总结
- WAS的SystemOut.log中报错“ADMS0015E”
- Windows下利用py2exe生成静默运行的命令行程序
- 通过 脚本执行 kettle 的作业 命令
- codevs 4919 线段树练习4
- 4并查集的合并与删除
- Android之Handler与多线程
- 1013 Problem M
- matlab中关于pushbotton的左键双击响应问题
- iOS中常用的几何方法
- 最全经典总结: ios跳转到第三方应用,APP互相跳转传值
- MySQL取得当前时间的函数是什么 格式化日期的函数是什么