#LeetCode
题目描述
初次解法
- 暴力解法
- 使用标记数组
class Solution {
public void setZeroes(int[][] matrix) {
// 暴力解法
// 找出需要置零的行数与列数
int[] colFlagArr = new int[matrix[0].length];
int[] rowFlagArr = new int[matrix.length];
for(int i = 0; i < matrix.length; i++){
for(int j = 0; j < matrix[0].length; j++){
if(matrix[i][j]==0){
colFlagArr[j] = 1;
rowFlagArr[i] = 1;
}
}
}
// 行置零
for(int i = 0; i < rowFlagArr.length; i++){
if(rowFlagArr[i] == 1){
for(int j = 0; j < matrix[0].length; j++){
matrix[i][j] = 0;
}
}
}
// 列置零
for(int i = 0; i < colFlagArr.length; i++){
if(colFlagArr[i] == 1){
for(int j = 0; j < matrix.length; j++){
matrix[j][i] = 0;
}
}
}
return;
}
}
优化解法(官方解一)
- 利用矩阵的第一行和第一列来取代暴力解法中的标记数组
- 另外起两个布尔值来分别标记第一行和第一列是否包含零值
class Solution {
public void setZeroes(int[][] matrix) {
// 使用布尔值来取代标记数组
boolean row_zero = false;
boolean col_zero = false;
for(int i = 0; i < matrix.length; i++){
if(matrix[i][0] == 0) col_zero = true;
}
for(int i = 0; i < matrix[0].length; i++){
if(matrix[0][i] == 0) row_zero = true;
}
for(int i = 1; i < matrix.length; i++){
for(int j = 1; j < matrix[0].length; j++){
if(matrix[i][j]==0){
matrix[i][0] = 0;
matrix[0][j] = 0;
}
}
}
for(int i = 1; i < matrix.length; i++){
for(int j = 1; j < matrix[0].length; j++){
if(matrix[i][0]==0 || matrix[0][j]==0){
matrix[i][j] = 0;
}
}
}
if(row_zero) {
for(int j = 0; j < matrix[0].length; j++){
matrix[0][j]=0;
}
}
if(col_zero) {
for(int j = 0; j < matrix.length; j++){
matrix[j][0]=0;
}
}
return;
}
}
优化解法(官方解二)
- 进一步优化,只用一个布尔值来表示第一行是否包含零值
- 用第一行的第一个元素来代表第一列是否包含0值
- 本质上效率和内存利用率没有提升
- 代码不写了