问题描述:
给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
解题思路:
使用flag标志变量表示遍历的方向,用模运算,实现数字循环变换。
通过边界是否交错判断决定是否继续遍历,只要不存在边界交错就继续遍历,循环体中模拟顺时针螺旋顺序遍历,只要碰到了边界就转向,同时重新定义边界。
整体就是一个模拟算法。
代码如下:
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
//从左往右,从上往下,往上碰撞后向右,往下碰撞后退出即可
ArrayList<Integer> list = new ArrayList<>();
boolean[][] visited = new boolean[matrix.length][matrix[0].length];//标记数组
int flag = 0;//标志方向 ,右0 下1 左 2 上 3,顺时针
int i = 0, j = 0;
//遇到边界要转向
int left = 0, right = matrix[0].length - 1, top = 0, bottom = matrix.length - 1;
while (left <= right && top <= bottom) {//只要不是两边界发生交错就可以继续遍历
list.add(matrix[i][j]);
if (j == right && flag==0) {//先转向下,再转向左,再转向上,再转向右
flag = (flag + 1) % 4;//模运算,实现数字循环变换
top++;
}
if (i == bottom && flag==1) {//向左
flag = (flag + 1) % 4;
right--;
}
if (j == left && flag==2) {//向上
flag = (flag + 1) % 4;
bottom--;
}
if (i == top && flag==3) {//向右
flag = (flag + 1) % 4;
left++;
}
//指针移动到下一个位置
switch (flag) {
case 0: //向右
j++;
break;
case 1://向下
i++;
break;
case 2://向左
j--;
break;
case 3://向上
i--;
break;
}
}
return list;
}
}