https://leetcode.com/problems/surrounded-regions/
我通读了社论,并编写了一个解决方案。一切都有意义,并且在本地我的代码将板更改为预期输出,但是当我将代码粘贴到 Leetcode 时,我的板保持不变。我使用他们的调试器并在第 24 行放置了一个断点,果然,我在板上没有看到任何变化。
不知道还能在哪里问这个问题,所以如果这不是正确的地方,我很抱歉。
以下是我的代码:
import java.util.Arrays;
class Solution {
private int ROWS;
private int COLS;
public void solve(char[][] board) {
ROWS = board.length;
COLS = board[0].length;
// parse left and right borders
for (int i = 0; i < ROWS; i++) {
DFS(board, i, 0); // left border
DFS(board, i, ROWS - 1); // right border
}
// parse top and bottom borders
for (int j = 0; j < COLS; j++) {
DFS(board, 0, j); // top border
DFS(board, COLS - 1, j); // bottom border
}
// after parsing, we end up with x, o, e board. Pass through it, and change
// 1) o to x
// 2) e to o
for (int i = 0; i < ROWS; i++) {
for (int j = 0; j < COLS; j++) {
if (board[i][j] == 'o') {
board[i][j] = 'x';
}
else if (board[i][j] == 'e') {
board[i][j] = 'o';
}
}
}
}
private void DFS(char[][] board, int i, int j) {
if (i >= ROWS || j >= COLS) return; // bounds
if (board[i][j] != 'o') return;
board[i][j] = 'e'; // temporary marker, to help identify border-connected cells
// go right
DFS(board, i, j + 1);
// go down
DFS(board, i + 1, j);
// go left
DFS(board, i, j - 1);
// go up
DFS(board, i - 1, j);
}
public static void main (String[] args) {
char[][] test1 = new char[][] {
{'x','x','x','x'},
{'x','o','o','x'},
{'x','x','o','x'},
{'x','o','x','x'}
};
new Solution().solve(test1);
Arrays.stream(test1).forEach(e -> System.out.println(Arrays.toString(e)));
}
}
在本地运行它,我得到了控制台中所期望的结果
[x,x,x,x]
[x,x,x,x]
[x,x,x,x]
[x,o,x,x]
您的主要问题是,您的代码假定由小写 O 和 X 组成的矩阵,而 LeetCode 问题则为您提供由大写 O 和 X 组成的矩阵。由于 'o'
与 'O'
不同,并且 'x'
与 'X'
不同,因此您的代码无法解决 LeetCode 问题。
将来,我建议在复制测试用例时使用复制粘贴,以便您得到完全正确的结果。
<小时/>
既然我在这里,我还将指出您的代码的另外两个问题:
- 深度优先搜索的逻辑可以确保您永远不会离开网格的底部或右侧边缘,但它不会执行任何操作来确保您永远不会离开顶部或左侧边缘。 (您的测试用例不会触发该问题,因为该测试用例的顶部或左侧边缘没有 O。)
- 您的代码有各种谈论“解析”的注释,而实际上您并没有做这样的事情。 (参见 https://www.google.com/search?q=parsing 。)显然,这不会影响代码的行为,但它可能会让人类读者感到困惑,或者至少让您看起来有点无能。我建议编写(例如)
//找到所有连接到左右边框的O,并将它们更改为E
。
我是一名优秀的程序员,十分优秀!