这是一道程序员面试金典上面的练习题;读完题其实结题思路很明显了;
输入矩阵—>搜索出为零的部位—>利用为零的部位信息重新遍历矩阵给该赋值0的位点给0—>结束
package shounue; import java.util.Scanner; public class SetMatrixZeroes { public static void setZeros(int[][] matrix){ boolean [] row = new boolean[matrix.length]; boolean [] column = new boolean[matrix[0].length]; for(int i = 0; i < matrix.length; i++) for(int j = 0; j < matrix[0].length; j++) { if(matrix[i][j] == 0) { row[i] = true; column[j] = true; } } for(int i = 0; i < matrix.length; i++) for(int j = 0; j < matrix[0].length;j++) { if(row[i]||column[j]) matrix[i][j] = 0; } } public static void main(String [] args){ Scanner in = new Scanner(System.in); System.out.println("please input row and column"); int row = in.nextInt(); int column = in.nextInt(); int [][] Arrays = new int[row][column]; for(int i = 0; i < Arrays.length; i++) for(int j = 0; j < Arrays[0].length;j++) Arrays[i][j] = in.nextInt(); setZeros(Arrays); for(int i = 0; i < Arrays.length; i++) { for(int j = 0; j < Arrays[0].length;j++) { System.out.print(Arrays[i][j]); System.out.print(" "); } System.out.println(); } } }
可以看到,常规解法时间复杂度还是蛮大的需要两次O(N*M)的统计过程;
回想到Leetcode 有相同的题目:73. Set Matrix Zeroes
解法如下:
public class Solution { public void setZeroes(int[][] matrix) { if(matrix == null || matrix.length == 0 || matrix[0].length == 0) return; //好的算法,都会事先对不可能的情况进行处理;数组处理NULL 和值 int m = matrix.length; int n = matrix[0].length; boolean row = false; boolean col = false; for(int i = 0; i < m; i++) { for(int j = 0; j < n; j++) { if(matrix[i][j]==0) { matrix[0][j] = 0; matrix[i][0] = 0; if(i==0) row = true; if(j==0) col = true; } } } for(int i = 1; i < m; i++) { if(matrix[i][0] == 0) { for(int j = 1; j < n; j++) matrix[i][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; } } if (row){ for(int j = 0; j < n; j++) matrix[0][j] = 0; } if(col){ for(int i = 0; i < m; i++) matrix[i][0] = 0; } } }
解题思路:
(1)将矩阵中有0的情况,推到矩阵的边缘上面来(也就是第一行,第一列);同时用两个寄存器记录下第一行和第一列是否为0的情况。整个过程十分类似经典手机游戏2048!
(2)利用第一行和第一列的情况给对应的行和列赋值0;
(3)最后利用两个寄存器的值重新判断第一行和第一列的赋值0情况;
相比第一种方案,有点在于减少了使用的寄存器,同时减少了不必要的重新赋值过程!!!!