当前位置:   article > 正文

leetcode 矩阵置零 java_leetcode java 矩阵置零

leetcode java 矩阵置零

给定一个 m x n矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0。请使用原地算法

示例 1:

  1. 输入:
  2. [
  3.   [1,1,1],
  4.   [1,0,1],
  5.   [1,1,1]
  6. ]
  7. 输出:
  8. [
  9.   [1,0,1],
  10.   [0,0,0],
  11.   [1,0,1]
  12. ]

示例 2:

  1. 输入:
  2. [
  3.   [0,1,2,0],
  4.   [3,4,5,2],
  5.   [1,3,1,5]
  6. ]
  7. 输出:
  8. [
  9.   [0,0,0,0],
  10.   [0,4,5,0],
  11.   [0,3,1,0]
  12. ]

进阶:

  • 一个直接的解决方案是使用  O(mn) 的额外空间,但这并不是一个好的解决方案。
  • 一个简单的改进方案是使用 O(m + n) 的额外空间,但这仍然不是最好的解决方案。
  • 你能想出一个常数空间的解决方案吗?

 

第一种方法,直接遍历。不保存下标值直接循环的话,被置为0的数将会在后续循环中影响其所在行和所在列。所以我们需要用两个set分别存储需要置为零的行下标和列下表。用set的好处是,它可以把相同的元素合并到同一个存储空间当中。这种思路比较好理解,但是运行结果不是太好。

这种方法使用了< O(m + n) 的额外空间

成功

显示详情

执行用时 : 6 ms, 在Set Matrix Zeroes的Java提交中击败了20.83% 的用户

内存消耗 : 52.4 MB, 在Set Matrix Zeroes的Java提交中击败了50.17% 的用户

  1. class Solution {
  2. //不保存下标值直接循环的话,被置为0的数将会在后续循环中影响其所在行和所在列。
  3. public void setZeroes(int[][] matrix) {
  4. int row = matrix.length;
  5. int col = matrix[0].length;
  6. HashSet<Integer> ri = new HashSet<Integer>();//所在行需要置零的下标
  7. HashSet<Integer> ci = new HashSet<Integer>();
  8. for(int i=0; i<row; i++){
  9. for(int j=0; j<col; j++){
  10. if(matrix[i][j] == 0){
  11. ri.add(i);
  12. ci.add(j);//set会将相同的元素合并到一个存储空间
  13. }
  14. }
  15. }
  16. for(int i: ri)
  17. Arrays.fill(matrix[i], 0);
  18. for(int j: ci){
  19. for(int i=0; i<row; i++)
  20. matrix[i][j] =0;
  21. }
  22. }
  23. }

第二种方法。该方法的空间复杂度即为一个常数,参考: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% 的用户

 

注意循环的条件,需要注意的地方代码里都放注释了。

  1. class Solution {
  2. public void setZeroes(int[][] matrix) {
  3. int row = matrix.length;
  4. int col = matrix[0].length;
  5. boolean row0 = false;
  6. boolean col0 = false;
  7. for(int i=0; i<row; i++){
  8. for(int j=0; j<col; j++){
  9. if(matrix[i][j] == 0){
  10. //注释掉的条件是为了捞回来matrix[0][0]=0的情况
  11. //if (i==0 && j!=0)
  12. if (i==0)
  13. row0 = true;
  14. //else if(i!=0 && j==0)
  15. if(j==0)
  16. col0 = true;
  17. matrix[0][j] = 0;
  18. matrix[i][0] = 0;
  19. }
  20. }
  21. }
  22. //除第一行外,其它行的处理
  23. for(int i=1; i<row; i++){
  24. if(matrix[i][0] == 0)
  25. Arrays.fill(matrix[i], 0);
  26. }
  27. //除第一列
  28. for(int j=1; j<col; j++){
  29. if(matrix[0][j] == 0){
  30. for(int i=0; i<row; i++)
  31. matrix[i][j] =0;
  32. }
  33. }
  34. // for(int i=1; i<row; i++){
  35. // for(int j=1; j<col; j++){
  36. // if(matrix[0][j]==0 || matrix[i][0] == 0){
  37. // matrix[i][j]=0;
  38. // }
  39. // }
  40. // }
  41. //最后处理第一行和第一列本来就为0的情况,顺序不能提前
  42. if(row0) Arrays.fill(matrix[0], 0);
  43. if(col0){
  44. for(int i=0; i<row; i++)
  45. matrix[i][0] = 0;
  46. }
  47. }
  48. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/257156
推荐阅读
相关标签
  

闽ICP备14008679号