19.螺旋矩阵
给你一个 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
代码:
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
//m为矩阵行数,n为矩阵列数
int m = matrix.length,n = matrix[0].length;
//dir为方向数组,分别对应向右,向下,向左,向上
int[][] dir = {{0,1},{1,0},{0,-1},{-1,0}};
//vis为标记数组,用于标记矩阵某个位置是否被访问过
int[][] vis = new int[m][n];;
//list用于存储最终结果
List<Integer>list = new ArrayList<>();
//d为方向标记,x,y为当前位置的横纵坐标
int d = 0,x = 0,y = 0;
//一共需要遍历m*n个元素
for(int i = 0;i < m*n;i++){
//标记当前位置被访问过
vis[x][y] = 1;
//将当前元素加入结果
list.add(matrix[x][y]);
//根据方向标记向对应方向移动
int x1 = x + dir[d][0],y1 = y + dir[d][1];
//如果当前位置出现越界或者已经被标记过了,说明方向有问题,调整方向
if(x1<0||x1>=m||y1<0||y1>=n||vis[x1][y1] == 1)d = (d+1)%4;
//确定最后移动后的位置
x += dir[d][0];
y += dir[d][1];
}
//返回结果
return list;
}
}

浙公网安备 33010602011771号