给你一个 m
行 n
列的矩阵 matrix
,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
示例 1:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]] 输出:[1,2,3,6,9,8,7,4,5]
示例 2:
输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]] 输出:[1,2,3,4,8,12,11,10,9,5,6,7]
提示:
-
m == matrix.length
-
n == matrix[i].length
-
1 <= m, n <= 10
-
-100 <= matrix[i][j] <= 100
思路:
这个题的思路就是循环打印,然后控制打印条件。我们需要观察打印出循环数组要什么条件,首先,是顺时针打印,我们会一层一层的打印,如图先打印红色,在打印蓝色,以此类推。
我们在观察打印完一圈,会有行减二,列减二的操作。这是一个大的规律,接下来开始顺时针遍历根据条件进行遍历,是比较简单的。
public static List<Integer> spiralOrder(int[][] matrix) {
//进行循环打印,围着二维数组顺时针打印一圈然后去掉第一行和最后一行,第一列和最后一列继续打印
//用来接收结果
List<Integer> list = new ArrayList();
//用来收缩第一行和最后一行
int firstRow = 0, lastRow = matrix.length - 1;
//用来收缩第一列和最后一列
int firstCol = 0, lastCol = matrix[0].length - 1;
//进入循环
while (firstRow <= lastRow && firstCol <= lastCol) {
//→
for (int i = firstCol; i <= lastCol; i++) list.add(matrix[firstRow][i]);
//↓
for (int i = firstRow + 1; i <= lastRow; i++) list.add(matrix[i][lastCol]);
//←
for (int i = lastCol - 1; i >= firstCol; i--) list.add(matrix[lastRow][i]);
//↑
for (int i = lastRow - 1; i > firstRow; i--) list.add(matrix[i][firstCol]);
//进行收缩
firstRow++;
lastRow--;
firstCol++;
lastCol--;
}
return list;
}
这样会存在一个问题就是对于单列、单行、→,↓,←就可以遍历出来的2*2数组遍历存在问题,需要加一点限制条件来控制,最后的代码如下:
//IDEA测试代码
public static void main(String[] args) {
int[][] h = {{1}, {2}, {3}, {4}, {5}, {6}, {7}, {8}, {9}, {10}};
System.out.println(spiralOrder(h));
}
public static List<Integer> spiralOrder(int[][] matrix) {
//进行循环打印,围着二维数组顺时针打印一圈然后去掉第一行和最后一行,第一列和最后一列继续打印
//用来接收结果
List<Integer> list = new ArrayList();
//用来收缩第一行和最后一行
int firstRow = 0, lastRow = matrix.length - 1;
//用来收缩第一列和最后一列
int firstCol = 0, lastCol = matrix[0].length - 1;
//进入循环
while (firstRow <= lastRow && firstCol <= lastCol) {
//→
for (int i = firstCol; i <= lastCol; i++) list.add(matrix[firstRow][i]);
//↓
if (firstRow != lastRow) {
for (int i = firstRow + 1; i <= lastRow; i++) list.add(matrix[i][lastCol]);
//←
if (firstRow != lastRow && firstCol != lastCol) {
for (int i = lastCol - 1; i >= firstCol; i--) list.add(matrix[lastRow][i]);
//↑
if ((firstRow + 1) != lastRow)
for (int i = lastRow - 1; i > firstRow; i--) list.add(matrix[i][firstCol]);
}
}
//进行收缩
firstRow++;
lastRow--;
firstCol++;
lastCol--;
}
return list;
}
总结:
这个题主要考察的就是循环遍历,如何根据题意来进行循环的控制,主要的难点就是要对各种情况进行周全考虑。