一、題目名稱java
Set Matrix Zeroes(將矩陣內含有零的行和列所有置零)
code
二、題目地址element
https://leetcode.com/problems/set-matrix-zeroes/
leetcode
三、題目內容開發
英文:Given a m x n matrix, if an element is 0, set its entire row and column to 0.get
中文:給定一個m×n的矩陣,若是其中一個元素是0,則將該元素所在的整行或整理所有置爲0hash
四、解題方法1it
使用第一行和第一列記錄某行或某列是否應置爲0,並再用兩個狀態位分別標記第一行和第一列是否也應該被置爲0.
io
Java代碼以下:class
/** * @功能說明:LeetCode 73 - Set Matrix Zeroes * @開發人員:Tsybius2014 * @開發時間:2015年11月7日 */ public class Solution { /** * 給定一個矩陣,將有0的行、列所有元素置0 * @param matrix */ public void setZeroes(int[][] matrix) { if (matrix == null || matrix.length == 0 || matrix[0].length == 0) { return; } int m = matrix.length; int n = matrix[0].length; boolean needFillFirstRow = false; boolean needFillFirstColumn = false; //找出含有0的行號和列號,記在該元素所在行列的第一個元素處 for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { if (matrix[i][j] == 0) { if (i == 0) { //若是某行第一個元素本來就爲0,記錄下這一點 needFillFirstRow = true; } if (j == 0) { //若是某列第一個元素本來就爲0,記錄下這一點 needFillFirstColumn = true; } matrix[i][0] = 0; matrix[0][j] = 0; } } } //按第一個元素的記錄狀況填充各行 for (int j = 1; j < n; j++) { if (matrix[0][j] == 0) { for (int i = 0; i < m; i++) { matrix[i][j] = 0; } } } //按第一個元素的記錄狀況填充各列 for (int i = 1; i < m; i++) { if (matrix[i][0] == 0) { for (int j = 1; j < n; j++) { matrix[i][j] = 0; } } } //確認是否須要填充第一行 if (needFillFirstRow) { for (int j = 0; j < n; j++) { matrix[0][j] = 0; } } //確認是否須要填充第一列 if (needFillFirstColumn) { for (int i = 0; i < m; i++) { matrix[i][0] = 0; } } } }
五、解題方法2
另外一個方式是不使用矩陣內部的元素記錄這些變化。而是使用鏈表(LinkedList)或是Hash集合(HashSet)記錄那些行、列須要被置0。
使用LinkedList的Java代碼以下:
import java.util.LinkedList; /** * @功能說明:LeetCode 73 - Set Matrix Zeroes * @開發人員:Tsybius2014 * @開發時間:2015年11月7日 */ public class Solution { /** * 給定一個矩陣,將有0的行、列所有元素置0 * @param matrix */ public void setZeroes(int[][] matrix) { if (matrix == null || matrix.length == 0 || matrix[0].length == 0) { return; } //鏈表,用於存儲行號和列號 LinkedList<Integer> linkedListRows = new LinkedList<Integer>(); LinkedList<Integer> linkedListColumns = new LinkedList<Integer>(); int m = matrix.length; int n = matrix[0].length; //找出含有0的行號和列號 for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { if (matrix[i][j] == 0) { linkedListRows.add(i); linkedListColumns.add(j); } } } //將含有0的各行置0 for (int i : linkedListRows) { for (int num = 0; num < n; num++) { matrix[i][num] = 0; } } //將含有0的各列置0 for (int j : linkedListColumns) { for (int num = 0; num < m; num++) { matrix[num][j] = 0; } } } }
使用HashSet的Java代碼以下:
import java.util.HashSet; /** * @功能說明:LeetCode 73 - Set Matrix Zeroes * @開發人員:Tsybius2014 * @開發時間:2015年11月7日 */ public class Solution { /** * 給定一個矩陣,將有0的行、列所有元素置0 * @param matrix */ public void setZeroes(int[][] matrix) { if (matrix == null || matrix.length == 0 || matrix[0].length == 0) { return; } //鏈表,用於存儲行號和列號 HashSet<Integer> hashSetRows = new HashSet<Integer>(); HashSet<Integer> hashSetColumns = new HashSet<Integer>(); int m = matrix.length; int n = matrix[0].length; //找出含有0的行號和列號 for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { if (matrix[i][j] == 0) { hashSetRows.add(i); hashSetColumns.add(j); } } } //將含有0的各行置0 for (int i : hashSetRows) { for (int num = 0; num < n; num++) { matrix[i][num] = 0; } } //將含有0的各列置0 for (int j : hashSetColumns) { for (int num = 0; num < m; num++) { matrix[num][j] = 0; } } } }
END