赞
踩
给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0。请使用原地算法。
示例 1:
- 输入:
- [
- [1,1,1],
- [1,0,1],
- [1,1,1]
- ]
- 输出:
- [
- [1,0,1],
- [0,0,0],
- [1,0,1]
- ]
示例 2:
- 输入:
- [
- [0,1,2,0],
- [3,4,5,2],
- [1,3,1,5]
- ]
- 输出:
- [
- [0,0,0,0],
- [0,4,5,0],
- [0,3,1,0]
- ]
进阶:
第一种方法,直接遍历。不保存下标值直接循环的话,被置为0的数将会在后续循环中影响其所在行和所在列。所以我们需要用两个set分别存储需要置为零的行下标和列下表。用set的好处是,它可以把相同的元素合并到同一个存储空间当中。这种思路比较好理解,但是运行结果不是太好。
这种方法使用了< O(m + n) 的额外空间
成功
执行用时 : 6 ms, 在Set Matrix Zeroes的Java提交中击败了20.83% 的用户
内存消耗 : 52.4 MB, 在Set Matrix Zeroes的Java提交中击败了50.17% 的用户
- class Solution {
- //不保存下标值直接循环的话,被置为0的数将会在后续循环中影响其所在行和所在列。
- public void setZeroes(int[][] matrix) {
- int row = matrix.length;
- int col = matrix[0].length;
- HashSet<Integer> ri = new HashSet<Integer>();//所在行需要置零的下标
- HashSet<Integer> ci = new HashSet<Integer>();
- for(int i=0; i<row; i++){
- for(int j=0; j<col; j++){
- if(matrix[i][j] == 0){
- ri.add(i);
- ci.add(j);//set会将相同的元素合并到一个存储空间
- }
- }
- }
- for(int i: ri)
- Arrays.fill(matrix[i], 0);
- for(int j: ci){
- for(int i=0; i<row; i++)
- matrix[i][j] =0;
- }
-
-
- }
- }

第二种方法。该方法的空间复杂度即为一个常数,参考:https://blog.csdn.net/whdAlive/article/details/80394700
第一步,双层循环矩阵所有元素,我们可以用第一行和第一列的元素来标记某列/某行是否需要置零。即当matrix[i][j] == 0时,令matrix[i][0]=0, matrix[0][j]=0.
第二步,单层循环第一行,若遇见matrix[0][j]==0的元素,则将第j列置为0;
单层循环第一列,若遇见matrix[i][0]==0的元素,则将第i行置为0;
走完这两步可以发现,第一行和第一列还没做处理(指的是第一行第一列本身就含有元素0的情况),我们借助两个标志量来指示第一行和第一列是否需要全部置0。
结果也不咋地,打扰了。。。
成功
执行用时 : 3 ms, 在Set Matrix Zeroes的Java提交中击败了76.55% 的用户
内存消耗 : 54.9 MB, 在Set Matrix Zeroes的Java提交中击败了21.75% 的用户
注意循环的条件,需要注意的地方代码里都放注释了。
- class Solution {
- public void setZeroes(int[][] matrix) {
- int row = matrix.length;
- int col = matrix[0].length;
- boolean row0 = false;
- boolean col0 = false;
- for(int i=0; i<row; i++){
- for(int j=0; j<col; j++){
- if(matrix[i][j] == 0){
- //注释掉的条件是为了捞回来matrix[0][0]=0的情况
- //if (i==0 && j!=0)
- if (i==0)
- row0 = true;
- //else if(i!=0 && j==0)
- if(j==0)
- col0 = true;
- matrix[0][j] = 0;
- matrix[i][0] = 0;
- }
- }
- }
- //除第一行外,其它行的处理
- for(int i=1; i<row; i++){
- if(matrix[i][0] == 0)
- Arrays.fill(matrix[i], 0);
- }
- //除第一列
- for(int j=1; j<col; j++){
- if(matrix[0][j] == 0){
- for(int i=0; i<row; i++)
- matrix[i][j] =0;
- }
- }
- // for(int i=1; i<row; i++){
- // for(int j=1; j<col; j++){
- // if(matrix[0][j]==0 || matrix[i][0] == 0){
- // matrix[i][j]=0;
- // }
- // }
- // }
- //最后处理第一行和第一列本来就为0的情况,顺序不能提前
- if(row0) Arrays.fill(matrix[0], 0);
- if(col0){
- for(int i=0; i<row; i++)
- matrix[i][0] = 0;
- }
- }
- }

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。