Leetcode 解决方案与本地环境(包围区域)的工作方式不同



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。显然,这不会影响你的代码行为,但它会让人类读者感到困惑,或者至少让你看起来有点无知。我建议写(例如(// find all O's connected to left and right borders, and change them to E's.

最新更新