我用此矩阵尝试了您的方法:
int[][] matrix = {{1,2,3}, {2,3,4}, {3,4,5}};
我什么也没得到
ArrayIndexOutOfBoundsException。您的代码似乎没有引发任何错误。
但是,我注意到输出不符合预期。它给我的输出是
12345432(只有8个数字),缺少
3矩阵中间的数字。
仔细查看您的代码后,我发现错误出在
if(izquierda >= derecha)。如果将其更改为
if(izquierda >derecha),则不会错过
3。出于同样的原因,您还需要检查
arriba > abajo,否则您的程序不适用于列多于行的任何矩阵。
编辑: 每个for循环后都需要这些检查。
我建议您将
return retorno;while循环移到外部,然后插入
break检查中:
public List<Integer> spiralOrder(int[][] matrix) { if(matrix == null || (matrix.length == 0)) return new ArrayList<Integer>(); int arriba = 0; int derecha = matrix[0].length - 1; int abajo = matrix.length - 1; int izquierda = 0; List<Integer> retorno = new ArrayList<Integer>(); while(true) { for(int i = izquierda; i <= derecha; i++) retorno.add(matrix[arriba][i]); arriba++; if(arriba > abajo) break; for(int i = arriba; i <= abajo; i++) retorno.add(matrix[i][derecha]); derecha--; if(izquierda > derecha) break; for(int i = derecha; i >= izquierda; i--) retorno.add(matrix[abajo][i]); abajo--; if(arriba > abajo) break; for(int i = abajo; i >= arriba; i--) retorno.add(matrix[i][izquierda]); izquierda++; if(izquierda > derecha) break; } return retorno;}
代码说明(应要求提供):
假设您有一个矩阵,四个矩阵围在矩阵周围,每个人都在一侧。这四名个人被称为
arriba,
derecha,
abajo,和
izquierda:
arriba 1 2 3 4 5izquierda 2 3 4 5 6 derecha 3 4 5 6 7 abajo
这四个人可以看到前面的数字行:
arriba
看到1 2 3 4 5
。derecha
看到5 6 7
。abajo
看到3 4 5 6 7
。izquierda
看到1 2 3
。
只要将这些人前面的所有数字都添加到列表中
retorno,他们就会向前跳一步。例如,在第一个for循环之后,它看起来像这样:
1 2 3 4 5arribaizquierda 2 3 4 5 6 derecha 3 4 5 6 7 abajo
在while循环的整个第一次迭代之后,它们的样子如下:
12 3 4 5arriba2 izquierda 3 4 5 derecha 6 abajo34 5 6 7
arriba
正在向下移动。derecha
向左移动。abajo
正在向上移动。izquierda
向右移动。
一旦这两个人中的 任何 一个经过彼此,您就会知道他们之间没有数字,因此您需要 立即 停止循环。这就是为什么您需要检查两个人是否每次 经过某个步骤
时 都经过对方(每个for循环之后)。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)