清除行列
2016-03-01 10:11
120 查看
题目描述
请编写一个算法,若MxN矩阵中某个元素为0,则将其所在的行与列清零。给定一个MxN的int[][]矩阵(C++中为vector>)mat和矩阵的阶数n,请返回完成操作后的int[][]矩阵(C++中为vector>),保证n小于等于300,矩阵中的元素为int范围内。
测试样例:
[[1,2,3],[0,1,2],[0,0,1]]
返回:[[0,0,3],[0,0,0],[0,0,0]]
解答
题目的一个坑
直接看题,可能会想要直接遍历整个矩阵,只要发现值为零的元素,就将它所在的行与列清零。但是这种方法存在一个陷阱:在读取被清零的行或列时,独到的全是零,于是它所在的行和列都得清零。结果就是,整个矩阵被清零。正确的打开方式
避坑的一个方法是,新建一个矩阵,来标记零元素的位置。然后遍历新建矩阵,将零元素所在行列清零。这种方法的空间复杂度是O(MN)。其实并不需要O(MN)的空间。既然打算将整行和整列清零,就不需要准确记录零元素的位置,而只需要知道某行、某列有元素为0就可以了。
class Clearer { public: vector<vector<int> > clearZero(vector<vector<int> > mat, int n) { // write code here bool *row = new bool[mat.size()]; bool *col = new bool[mat[0].size()]; for(int i = 0;i<mat.size();++i) row[i] = false; for(int i = 0;i<mat[0].size();++i) col[i] = false; for(int i = 0;i<mat.size();++i) { for(int j = 0;j<mat[0].size();++j) { if(mat[i][j] == 0) { row[i] = true; col[j] = true; } } } for(int i = 0;i<mat.size();++i) { for(int j = 0;j<mat[0].size();++j) { if(row[i] || col[j]) { mat[i][j] = 0; } } } return mat; } };
相关文章推荐
- JAVA学习20160301
- jquery滚动条定位
- Mysql 基本操作
- Android开发中一些被冷落但却很有用的类和方法
- POJ 2409 Let it Bead(polya)
- Metasploit 资源文件
- Docker 使用总结
- mysql的关闭和启动方式
- 换钱问题(经典枚举样例)
- 2.5.1 Ext.get方法的使用
- linux的帮助命令
- Android应用启动优化:一种DelayLoad的实现和原理
- VMware-workstation中文版修改成英文版简单方法
- LeetCode:181. Employees Earning More Than Their Managers
- 自我质量管控
- iOS开发中 色值 16进制相互转换 详细RGB值
- 开通博客了
- 易出错的C语言题目之二:指针
- Nginx配置文件nginx.conf中文详解
- nginx实现代理和负载均衡