题目描述:
解题思路:
1、这道题一开始想尝试用dfs去解决,但是边界和判断的地方一直有问题,但是dfs是肯定能解开的,调试了好久,最终过了,但是解法的效率很低。
2、看别人的题解,分别有O(n+m)和O(1)的解法。
3、我也太菜了。
参考代码:
dfs
int[][] res;
boolean[][] pan;
int[][] arr;
public void setZeroes(int[][] matrix) {
this.res = matrix;
pan = new boolean[matrix.length][matrix[0].length];
arr = new int[matrix.length][matrix[0].length];
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[0].length; j++) {
if (matrix[i][j] == 0) {
arr[i][j] = 1;
}
}
}
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[0].length; j++) {
if (arr[i][j] == 1) {
dfs(i, j, i, j);
check();
}
}
}
}
private void dfs(int x, int y, int flagx, int flagy) {
if (x >= res.length || y >= res[0].length || x < 0 || y < 0 || pan[x][y] == true) {
return;
}
if (flagx == x || flagy == y) {
res[x][y] = 0;
}
pan[x][y] = true;
dfs(x + 1, y, flagx, flagy);
dfs(x - 1, y, flagx, flagy);
dfs(x, y + 1, flagx, flagy);
dfs(x, y - 1, flagx, flagy);
}
//判断走过的路的flag清空
private void check() {
for (int i = 0; i < pan.length; i++) {
for (int j = 0; j < pan[0].length; j++) {
pan[i][j] = false;
}
}
}
O(n+m)
public void setZeroes(int[][] matrix) {
//保存行里面有0的位置
List<Integer> listx=new ArrayList<>();
//保存列里面有0的位置
List<Integer> listy=new ArrayList<>();
//遍历保存
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[0].length; j++) {
if(matrix[i][j]==0)
{
listx.add(i);
listy.add(j);
}
}
}
//更新
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[0].length; j++) {
if(listx.contains(i)||listy.contains(j))
{
matrix[i][j]=0;
}
}
}
}
O(1)
public void setZeroes(int[][] matrix) {
//第一行是否有0的标志
boolean flagx = false;
//第一列是否有0的标志
boolean flagy = false;
for (int i = 0; i < matrix.length; i++) {
if (matrix[i][0] == 0) {
flagx = true;
}
}
for (int j = 0; j < matrix[0].length; j++) {
if (matrix[0][j] == 0) {
flagy = true;
}
}
//将整个包含0的位置信息,更新到第一行第一列
for (int i = 1; i < matrix.length; i++) {
for (int j = 1; j < matrix[0].length; j++) {
if (matrix[i][j] == 0) {
matrix[0][j] = 0;
matrix[i][0] = 0;
}
}
}
//判断,如果第一行第一列是0.将对应的那一行上的值更换为0
for (int i = 1; i < matrix.length; i++) {
for (int j = 1; j < matrix[0].length; j++) {
if (matrix[0][j] == 0 || matrix[i][0] == 0) {
matrix[i][j] = 0;
}
}
}
//如果第一行一开始有0的话,就更新整个第一行
if(flagx){
for (int i = 0; i < matrix.length; i++) {
matrix[i][0]=0;
}
}
//如果第一列一开始有0的话,更新整个第一列
if(flagy){
for (int j = 0; j < matrix[0].length; j++) {
matrix[0][j]=0;
}
}
}