Leetcode 54. 螺旋矩阵为什么数组会下标越界

class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        int m = matrix.length;
        int n = matrix[0].length;
        boolean[][] mark = new boolean[m][n];
        List<Integer> res = new ArrayList<>();
        int i = 0, j = 0;
        while(res.size() < m*n) {
            while(j < n && mark[i][i] == false) {
                res.add(matrix[i][j]);
                mark[i][j] = true;
                j++;
            }
            j--;
            while(i < m && mark[i][j] == false) {
                res.add(matrix[i][j]);
                mark[i][j] = true;
                i++;
            }
            i--;
            while(j >= 0 && mark[i][j] == false) {
                res.add(matrix[i][j]);
                mark[i][j] = true;
                j--;
            }
            j++;
            while(i >= 0 && mark[i][j] == false) {
                res.add(matrix[i][j]);
                mark[i][j] = true;
                i--;
            }
            i++;
        }
        return res;
    }
}

Leetcode 54. 螺旋矩阵
为什么数组会下标越界?

该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
在您提供的代码中,可能会出现数组下标越界的问题。具体来说,当 ij 取到边界时,循环仍然会继续执行,导致数组下标越界。

例如,在第一个 while 循环中,当 j 达到 n 时,下一次循环仍然会执行 matrix[i][j],这将导致数组下标越界。

为了解决这个问题,您可以在每次循环之前检查数组下标是否越界,如果越界,则退出循环。例如,在第一个 while 循环中,您可以添加以下检查:

while(j < n && mark[i][j] == false) {
    res.add(matrix[i][j]);
    mark[i][j] = true;
    j++;
}
j--;

在这里,我们首先检查 j < n 是否成立,如果成立,则执行循环体,否则退出循环。

您可以对其他循环也进行类似的修改,以避免数组下标越界的问题。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/714668
  • 这篇博客也不错, 你可以看下leetcode 48. 旋转图像(对矩阵的对角、左右旋转)
  • 除此之外, 这篇博客: Leetcode 337. 打家劫舍Ⅲ的两种解法中的 Leetcode 337. 打家劫舍Ⅲ 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 您还可以看一下 孙玖祥老师的图解数据结构与算法课程中的 使用栈完成leetCode题目小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    针对Leetcode 54题螺旋矩阵出现的下标越界问题,问题出现在访问二维数组时,下标超出了数组的范围。可以检查代码中数组的声明与初始化,以及访问数组时的下标变量是否正确。同时可以增加一些边界条件的判断,避免数组下标超出范围导致程序崩溃。

    关于Leetcode 54题螺旋矩阵的解法,在位置(x,y)处,可以顺序遍历该位置右边,下面,左边,上面四个方向,每到一个位置则将该位置所对应的值加入结果的列表中,并将该位置的值改为一个特殊的值,表示已经访问过,避免重复访问。如果下一个位置超出边界或者已经访问过,则改变遍历方向。最终得到的结果列表即为螺旋矩阵的遍历结果。

    以下是可能出现下标越界问题的代码片段:

    matrix = [[1,2,3],[4,5,6],[7,8,9]] m, n = len(matrix), len(matrix[0]) visited = [[False] n for _ in range(m)] res = [] x, y, dx, dy = 0, 0, 0, 1 for _ in range(mn): res.append(matrix[x][y]) visited[x][y] = True if visited[(x+dx)%m][(y+dy)%n]: dx,dy = dy,-dx x += dx y += dy

    解决办法可以是先判断下标是否越界,再进行赋值,如下所示:

    if x < m and y < n and not visited[x][y]: res.append(matrix[x][y]) visited[x][y] = True

    这样就可以避免出现下标越界的问题。当然这只是其中一种解决方案,在具体实现过程中还需要考虑其他可能出现的问题。