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ᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
在您提供的代码中,可能会出现数组下标越界的问题。具体来说,当 i
或 j
取到边界时,循环仍然会继续执行,导致数组下标越界。
例如,在第一个 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
是否成立,如果成立,则执行循环体,否则退出循环。
您可以对其他循环也进行类似的修改,以避免数组下标越界的问题。
如果以上回答对您有所帮助,点击一下采纳该答案~谢谢
针对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
这样就可以避免出现下标越界的问题。当然这只是其中一种解决方案,在具体实现过程中还需要考虑其他可能出现的问题。