使用状态机的思路,运用四个状态来回切换,并用count计算步长最终退出。
static public List<Integer> spiralOrder(int[][] matrix) {
// Write your code here
List<Integer> ret = new ArrayList<>();
if (matrix.length == 0) return ret;
int i = 0;
int j = 0;
int state = 2;
int maxstep = matrix.length * matrix[0].length;
int count = 0;
final int TURNLEFT = 1, TURNRIGHT = 2, TURNUP = 3, TURNDOWM = 4;//定义了四种状态
int visited[][] = new int[matrix.length][matrix[0].length];//定义一个已走过的矩阵
while (count < matrix.length * matrix[0].length) {
int temp = matrix[i][j];
count++;//每走一次都加一
switch (state) {
case TURNLEFT: {
ret.add(temp);
visited[i][j] = 1;
if (j == 0 || visited[i][j - 1] == 1) {
i--;
state = TURNUP;
}
else {
j--;
state = TURNLEFT;
}
break;
}
case TURNRIGHT: {
ret.add(temp);
visited[i][j] = 1;
if (j + 1 == matrix[0].length || visited[i][j + 1] == 1) {
state = TURNDOWM;
i++;
}
else {
j++;
state = TURNRIGHT;
}
break;
}
case TURNUP: {
ret.add(temp);
visited[i][j] = 1;
if (i == 0 || visited[i - 1][j] == 1) {
j++;
state = TURNRIGHT;
}
else {
i--;
state = TURNUP;
}
break;
}
case TURNDOWM: {
ret.add(temp);
visited[i][j] = 1;
if (i + 1 == matrix.length || visited[i + 1][j] == 1) {
j--;
state = TURNLEFT;
}
else {
i++;
state = TURNDOWM;
}
break;
}
}
}
return ret;
}
本文介绍了一种使用状态机实现的矩阵螺旋遍历算法。通过定义四种状态:左转、右转、上移和下移,并结合已访问标记矩阵来避免重复访问,实现了对二维矩阵的螺旋式遍历。
9219

被折叠的 条评论
为什么被折叠?



