给定一个二维数组 array
,请返回「螺旋遍历」该数组的结果。
螺旋遍历:从左上角开始,按照 向右、向下、向左、向上 的顺序 依次 提取元素,然后再进入内部一层重复相同的步骤,直到提取完所有元素。
示例 1:
输入:array = [[1,2,3],[8,9,4],[7,6,5]] 输出:[1,2,3,4,5,6,7,8,9]
示例 2:
输入:array = [[1,2,3,4],[12,13,14,5],[11,16,15,6],[10,9,8,7]] 输出:[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]
LCR 146. 螺旋遍历二维数组 - 力扣(LeetCode)
这是一个循环嵌套循环的问题,需要理清楚再写。
class Solution {
public int[] spiralArray(int[][] array) {
if (array == null || array.length == 0 || array[0].length == 0) {
return new int[0]; // 如果数组为空,返回空数组
}
int X = array.length;
int Y = array[0].length;
int startX = 0;
int endX = X - 1;
int startY = 0;
int endY = Y - 1;
int[] result = new int[X*Y];
int index = 0;
while(startX <= endX && startY <= endY){
for(int i = startY; i <= endY; i++){
result[index] = array[startX][i];
index++;
}
startX++;
for(int j = startX; j <= endX; j++){
result[index] = array[j][endY];
index++;
}
endY--;
for(int k = endY; k >= startY; k--){
result[index] = array[endX][k];
index++;
}
endX--;
for(int l = endX; l >= startX; l--){
result[index] = array[l][startY];
index++;
}
startY++;
}
return result;
}
}
这是我第一遍写的代码,数组边界搞懵逼了好几次,这个题目还是需要搞懂数组边界情况。然后这个代码在遇到{[2,3]}这种单列矩阵的时候报错了。
对于单行和单列的矩阵,你第一个循环把第一行或者第一列遍历完,但是后续的三个循环还是会执行,比如{{2,3,4,5}这个单行矩阵,第一个循环结束是2345,然后第二个循环不执行,第三个循环就会从endY = 3 开始遍历如果我们限定数组长度就会生越界。需要在下面的三个循环外面加上判断条件防止重复遍历。改完后代码如下:
class Solution {
public int[] spiralArray(int[][] array) {
if (array == null || array.length == 0 || array[0].length == 0) {
return new int[0]; // 如果数组为空,返回空数组
}
int X = array.length;
int Y = array[0].length;
int startX = 0;
int endX = X - 1;
int startY = 0;
int endY = Y - 1;
int[] result = new int[X*Y];
int index = 0;
while(startX <= endX && startY <= endY){
for(int i = startY; i <= endY; i++){
result[index] = array[startX][i];
index++;
}
startX++;
for(int j = startX; j <= endX; j++){
result[index] = array[j][endY];
index++;
}
endY--;
if(startX <= endX){
for(int k = endY; k >= startY; k--){
result[index] = array[endX][k];
index++;
}
endX--;
}
if(startY <= endY){
for(int l = endX; l >= startX; l--){
result[index] = array[l][startY];
index++;
}
startY++;}
}
return result;
}
}