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