给定一个 m x n
的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。
进阶:
O(mn)
的额外空间,但这并不是一个好的解决方案。O(m + n)
的额外空间,但这仍然不是最好的解决方案。
示例 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
//原地置换法
1 //方法取巧了,毕竟任何数值都可能出现,而我选择一个未出现的数值作为0的暂时伪装值。 2 class Solution { 3 public void setZeroes(int[][] matrix) { 4 5 if(matrix==null||matrix.length==0){ 6 return; 7 } 8 9 int m=matrix.length; 10 int n=matrix[0].length; 11 for (int i = 0; i < m; i++) { 12 for (int i1 = 0; i1 < n; i1++) { 13 if(matrix[i][i1]==0){ 14 //把0变成-10702351,这样可以避免在递归时,重复处理0的这行,导致递归出不来 15 matrix[i][i1]=-10702351; 16 fun(matrix,i,i1); 17 } 18 } 19 } 20 for (int i = 0; i < m; i++) { 21 for (int i1 = 0; i1 < n; i1++) { 22 if(matrix[i][i1]==-10702351){ 23 matrix[i][i1]=0; 24 } 25 } 26 } 27 } 28 29 //处理当前matrix[m][n]所在的行列,值设为-10702351(某个不会出现的数值) 30 //当前matrix[m][n]所在的行列有0,递归处理。 31 public static void fun(int[][] matrix,int m,int n){ 32 for (int i = 0; i < matrix.length; i++) { 33 if(matrix[i][n]==0){ 34 matrix[i][n]=-10702351; 35 fun(matrix,i,n); 36 }else { 37 matrix[i][n]=-10702351; 38 } 39 } 40 for (int i = 0; i < matrix[m].length; i++) { 41 if(matrix[m][i]==0){ 42 matrix[m][i]=-10702351; 43 fun(matrix,m,i); 44 }else { 45 matrix[m][i]=-10702351; 46 } 47 } 48 } 49 }
原文:https://www.cnblogs.com/SEU-ZCY/p/14710834.html