给定一个二维数组 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;}
}