1. 程式人生 > >[LeetCode] 73. Set Matrix Zeroes Java

[LeetCode] 73. Set Matrix Zeroes Java

ger 是否 -s could ret ext hash blog span

題目:

iven a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place.

click to show follow up.

Follow up:

Did you use extra space?
A straight forward solution using O(mn) space is probably a bad idea.
A simple improvement uses O(m + n) space, but still not the best solution.
Could you devise a constant space solution?

題意及分析:如果一個矩陣的元素為0,那麽其所在行和所在列都設置為0,能不能使用空間復雜度為o(1)

代碼一:遍歷matrix,分別用兩個集合記錄需要變化的行和列,然後在遍歷設置,空間復雜度為0(m+ns)

 1 class Solution {
 2     public void setZeroes(int[][] matrix) {
 3         int row = matrix.length;
 4         if(row==0) return;
 5         int col = matrix[0].length;
 6 
 7         Set<Integer> rowSet = new
HashSet<>(); 8 Set<Integer> colSet = new HashSet<>(); 9 10 for(int i=0;i<row;i++){ 11 for(int j=0;j<col;j++){ 12 if(matrix[i][j]==0){ 13 rowSet.add(i); 14 colSet.add(j); 15 } 16
} 17 } 18 19 // 20 Iterator<Integer> iterator = rowSet.iterator(); 21 while(iterator.hasNext()){ 22 Integer res = iterator.next(); 23 for(int i=0;i<col;i++){ 24 matrix[res][i] = 0; 25 } 26 } 27 28 iterator = colSet.iterator(); 29 while(iterator.hasNext()){ 30 Integer res = iterator.next(); 31 for(int i=0;i<row;i++){ 32 matrix[i][res] = 0; 33 } 34 } 35 } 36 }

代碼二:不使用額外空間的方法類似,就是把第一行和第一列作為標記。 首先 先判斷第一行第一列是否含有0,並用兩個bool變量記錄起來。這樣,遍歷一遍之後就把所有的行和列都在第一行和第一列中體現出來。接下來就是,根據第一行和第一列的0元素,把其所在的行和列置0,不包括第一行和第一列。

 1 class Solution {
 2     public void setZeroes(int[][] matrix) {
 3         int row = matrix.length;
 4         if(row==0) return;;
 5         int col = matrix[0].length;
 6         boolean fr = false,fc = false;
 7         for(int i=0;i<row;i++){
 8             for(int j=0;j<col;j++){
 9                 if(matrix[i][j]==0){
10                     if(i == 0) fr = true;
11                     if(j == 0) fc = true;
12                     matrix[0][j]=0;
13                     matrix[i][0]=0;
14                 }
15             }
16         }
17         //根據第一行和第一列的0元素,把其所在的行和列置0,不包括第一行和第一列。
18         for(int i=1;i<row;i++) {
19             for (int j = 1; j < col; j++) {
20                 if(matrix[i][0] == 0 || matrix[0][j] == 0) {
21                     matrix[i][j] = 0;
22                 }
23             }
24         }
25 
26 
27         //最後如果第一行有或者第一列原來就有為0的元素,置為0
28         if(fr){
29             for(int i=0;i<col;i++){
30                 matrix[0][i] = 0;
31             }
32         }
33         if(fc) {
34             for(int i = 0; i < row; i++) {
35                 matrix[i][0] = 0;
36             }
37         }
38     }
39 }

[LeetCode] 73. Set Matrix Zeroes Java