Set Matrix Zeroes
2015-07-17 09:40
239 查看
Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place.
思路:其实主要就是找出哪一行哪一列应该被设置为0,如果用两个list来记录哪些行和哪些列应该被设置为0,很容易就可以写出算法。但是题目要求空间复杂度为o(1),可利用以第一行和第一列来记录哪些行和哪些列应该被设置为0。
首先遍历第一行和第一列,记录第一行和第一列中是否存在0
从第二行第二列开始遍历,如果遇到当前数字a[i][j]为0(其中i>=1且j>=1),就标记a[0][j]为0,代表第j列应该被设置为0,同理标记a[i][0]为0,代表第i行应该被设置为0。不用觉得破坏了第一行或者第一列的数据,因为这些数字本该是要被设置为0的
遍历完成后,再次遍历第一行和第一列,遇到当前数字为0将对应的行或者列设置为0
但是要注意的是你无法知道第一行或者第一列中的0是本来有的,还是遍历的过程中标记的,不过还好最开始的时候你先遍历过第一行和第一列,已经知道了第一行或者第一列中是否存在0。如果第一行中存在0,那就将第一行全部置为0,如果第一列存在0,那就将第一列全部置为0
注意:不能直接去矩阵遍历,然后遇到为0的数字,就将当前列和当前行全部置为0,这样会影响下次遍历到当前行或者当前列中的数字,因为你无法判断当前的数字的0是你置为0的还是本来就是0.
思路:其实主要就是找出哪一行哪一列应该被设置为0,如果用两个list来记录哪些行和哪些列应该被设置为0,很容易就可以写出算法。但是题目要求空间复杂度为o(1),可利用以第一行和第一列来记录哪些行和哪些列应该被设置为0。
首先遍历第一行和第一列,记录第一行和第一列中是否存在0
从第二行第二列开始遍历,如果遇到当前数字a[i][j]为0(其中i>=1且j>=1),就标记a[0][j]为0,代表第j列应该被设置为0,同理标记a[i][0]为0,代表第i行应该被设置为0。不用觉得破坏了第一行或者第一列的数据,因为这些数字本该是要被设置为0的
遍历完成后,再次遍历第一行和第一列,遇到当前数字为0将对应的行或者列设置为0
但是要注意的是你无法知道第一行或者第一列中的0是本来有的,还是遍历的过程中标记的,不过还好最开始的时候你先遍历过第一行和第一列,已经知道了第一行或者第一列中是否存在0。如果第一行中存在0,那就将第一行全部置为0,如果第一列存在0,那就将第一列全部置为0
注意:不能直接去矩阵遍历,然后遇到为0的数字,就将当前列和当前行全部置为0,这样会影响下次遍历到当前行或者当前列中的数字,因为你无法判断当前的数字的0是你置为0的还是本来就是0.
public class Solution { public void setZeroes(int[][] matrix) { int m = matrix.length; int n = matrix[0].length; boolean firstrow=false; boolean firstcol=false; for(int j=0;j<n;j++) { if(matrix[0][j]==0) { firstrow=true; break; } } for(int i=0;i<m;i++) { if(matrix[i][0]==0) { firstcol=true; break; } } for(int i=1;i<m;i++) { for(int j=1;j<n;j++) { if(matrix[i][j]==0) { matrix[i][0]=0; matrix[0][j]=0; } } } for(int j=1;j<n;j++) { if(matrix[0][j]==0) { for(int i=1;i<m;i++) matrix[i][j]=0; } } for(int i=1;i<m;i++) { if(matrix[i][0]==0) { for(int j=1;j<n;j++) matrix[i][j]=0; } } if(firstrow) { for(int j=0;j<n;j++) matrix[0][j]=0; } if(firstcol) { for(int i=0;i<m;i++) matrix[i][0]=0; } } }
相关文章推荐
- 推荐系统原理介绍
- 恩布企业 IM iOS端 1.1 发布, 开源手机 IM
- osg示例简介
- VMware Vsphere高可性(HA-FT群集)
- FoonSunCMS-Word图片上传功能-Xproer.WordPaster
- a标签 中调用js的几种方法
- acm CodeForces 546B
- 遍历Map集合
- Windows 8(虚拟机环境)安装.NET Framework3.5(includes .NET 2.0 and 3.0)
- 计算机中浮点数的表示
- Hadoop1.2.1单机版部署
- MySQL打开的文件描述符限制
- js常用插件
- oracle从备份归档日志的方法集中回收
- const修饰符
- 使用java和javascript判断当前浏览者的操作系统
- UVA 11462 Age Sort
- iPhone 6 / 6 Plus 设计·适配方案
- ArcEngle中空值(Null \ Nodata)值的处理
- ACM比赛