LeetCode:矩陣置零【73】
阿新 • • 發佈:2018-11-03
LeetCode:矩陣置零【73】
題目描述
給定一個 m x n 的矩陣,如果一個元素為 0,則將其所在行和列的所有元素都設為 0。請使用原地演算法。
示例 1:
輸入: [ [1,1,1], [1,0,1], [1,1,1] ] 輸出: [ [1,0,1], [0,0,0], [1,0,1] ]
示例 2:
輸入: [ [0,1,2,0], [3,4,5,2], [1,3,1,5] ] 輸出: [ [0,0,0,0], [0,4,5,0], [0,3,1,0] ]
進階:
- 一個直接的解決方案是使用 O(mn) 的額外空間,但這並不是一個好的解決方案。
- 一個簡單的改進方案是使用 O(m + n) 的額外空間,但這仍然不是最好的解決方案。
- 你能想出一個常數空間的解決方案嗎?
題目分析
關於進階的內容,大家可以思考,這裡也給出大家官方的題解:
LeetCode官方題解:https://leetcode.com/articles/set-matrix-zeroes/
這道題能總而言之,不能想當然的認為,在處理過程中需要處理所有的新生成的零。那麼的直觀思路就遍歷兩邊陣列,第一遍是用HashSet去記錄每個0點的橫縱座標,然後第二遍迴圈再把那些在已記錄的行或列上的元素全部賦值為0即可。
Java題解
package arr; import java.util.HashMap; import java.util.HashSet; import java.util.Set; public class SetMatrixZeroes_73 { public void setZeroes(int[][] matrix) { int R = matrix.length; int C = matrix[0].length; Set<Integer> rows = new HashSet<Integer>(); Set<Integer> cols = new HashSet<Integer>(); for (int i = 0; i < R; i++) { for (int j = 0; j < C; j++) { if (matrix[i][j] == 0) { rows.add(i); cols.add(j); } } } for (int i = 0; i < R; i++) { for (int j = 0; j < C; j++) { if (rows.contains(i) || cols.contains(j)) { matrix[i][j] = 0; } } } } }