问题描述
我正在尝试使用 DFS 解决 LeetCode 中的 01 矩阵问题 https://leetcode.com/problems/01-matrix/。我的天真的 DFS 解决方案超出了时间限制。我用记忆优化了它。但是,解决方案并不正确。代码如下,谁能帮我找出我的代码的哪一部分有问题?我还在下面附上了天真的 DFS 解决方案。
import java.util.Arrays
//This is buggy optimized DFS Solution
public class Solution {
public int[][] updateMatrix(int[][] matrix) {
int m = matrix.length,n = matrix[0].length;
int[][] dp = new int[m][n];
for (int[] row : dp) {
Arrays.fill(row,Integer.MAX_VALUE);
}
boolean[][] marked;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
marked = new boolean[m][n];
dp[i][j] = DFS(matrix,dp,i,j,marked);
}
}
return dp;
}
public int DFS(int[][] matrix,int[][] dp,int i,int j,boolean[][] marked) {
if (i < 0 || i >= matrix.length || j < 0 || j >= matrix[0].length || marked[i][j]) {
return 10001;
}
if (matrix[i][j] == 0) {
return 0;
}
if (dp[i][j] != Integer.MAX_VALUE) {
return dp[i][j];
}
marked[i][j] = true;
int up = 1 + DFS(matrix,i - 1,marked);
int down = 1 + DFS(matrix,i + 1,marked);
int vertical = Math.min(up,down);
int left = 1 + DFS(matrix,j - 1,marked);
int right = 1 + DFS(matrix,j + 1,marked);
int horizontal = Math.min(left,right);
int res = Math.min(vertical,horizontal);
marked[i][j] = false;
dp[i][j] = Math.min(dp[i][j],res);
return res;
}
}
import java.util.Arrays
//This is my naive solution
public class Solution {
public int[][] updateMatrix(int[][] matrix) {
int m = matrix.length,n = matrix[0].length;
int[][] dp = new int[m][n];
for (int[] row : dp) {
Arrays.fill(row,Integer.MAX_VALUE);
}
boolean[][] marked;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
marked = new boolean[m][n];
dp[i][j] = DFS(matrix,marked);
}
}
return dp;
}
public int DFS(int[][] matrix,boolean[][] marked) {
if (i < 0 || i >= matrix.length || j < 0 || j >= matrix[0].length || marked[i][j]) {
return 10001;
}
if (matrix[i][j] == 0) {
return 0;
}
marked[i][j] = true;
int up = 1 + DFS(matrix,marked);
int down = 1 + DFS(matrix,marked);
int vertical = Math.min(up,down);
int left = 1 + DFS(matrix,marked);
int right = 1 + DFS(matrix,marked);
int horizontal = Math.min(left,right);
int res = Math.min(vertical,horizontal);
marked[i][j] = false;
return res;
}
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)