标签:
1、题目名称
Set Matrix Zeroes(将矩阵内含有零的行和列全部置零)
2、题目地址
https://leetcode.com/problems/set-matrix-zeroes/
3、题目内容
英文:Given a m x n matrix, if an element is 0, set its entire row and column to 0.
中文:给定一个m×n的矩阵,如果其中一个元素是0,则将该元素所在的整行或整理全部置为0
4、解题方法1
使用第一行和第一列记录某行或某列是否应置为0,并再用两个状态位分别标记第一行和第一列是否也应该被置为0.
Java代码如下:
/** * @功能说明: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; } } } }
5、解题方法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
LeetCode:Set Matrix Zeroes - 将矩阵内含有零的行和列全部置零
标签:
原文地址:http://my.oschina.net/Tsybius2014/blog/527489