14.矩阵置零

73. 矩阵置零

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

 

示例 1:

输入:matrix = [[1,1,1],[1,0,1],[1,1,1]]
输出:[[1,0,1],[0,0,0],[1,0,1]]

示例 2:

输入:matrix = [[0,1,2,0],[3,4,5,2],[1,3,1,5]]
输出:[[0,0,0,0],[0,4,5,0],[0,3,1,0]]

 

提示:

  • m == matrix.length
  • n == matrix[0].length
  • 1 <= m, n <= 200
  • -231 <= matrix[i][j] <= 231 - 1

 

进阶:

  • 一个直观的解决方案是使用  O(mn) 的额外空间,但这并不是一个好的解决方案。
  • 一个简单的改进方案是使用 O(m + n) 的额外空间,但这仍然不是最好的解决方案。
  • 你能想出一个仅使用常量空间的解决方案吗?
 1 class Solution {
 2     public void setZeroes(int[][] matrix) {
 3         //行数
 4         int m = matrix.length;
 5         //列数
 6         int n = matrix[0].length;
 7         //将需要改变的位置记录在两个一维boolean数组中,也可以设置为int型,将需要修改的置1
 8         boolean[] row = new boolean[m];
 9         boolean[] col = new boolean[n];
10         //遍历获取需要修改位置的元素
11         for(int i = 0;i < m;i++){
12             for(int j = 0;j < n;j++){
13                 if(matrix[i][j] == 0){
14                     row[i] = col[j] = true;
15                 }
16             }
17         }
18         //将需要置0的位置上元素进行置0
19         for(int i =0;i < m;i++){
20             for(int j = 0;j < n;j++){
21                 if(row[i] || col[j]){
22                     matrix[i][j] = 0;
23                 }
24             }
25         }
26     }
27 }
关键点:用boolean[]分别将需要置0的行和列记录下来,再对原矩阵进行置0修改
小技巧:当涉及当多维数组且需要记录当前格子的状态(与其他格子有一定关系如13题有效的数独),可以考虑使用布尔类型的数组,记录状态

posted on 2022-06-17 07:33  HHHuskie  阅读(64)  评论(0编辑  收藏  举报

导航