一、题目名称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