题解 | #牧场边界巡游#
牧场边界巡游
https://www.nowcoder.com/practice/bc7fe78f7bcc49a8bc0afdd7a55ca810
import java.util.*;
public class Solution {
public int[] spiralTravelCounterClockwise(int[][] matrix) {
// 行数
int m = matrix.length;
// 列数
int n = matrix[0].length;
// 结果List
List<Integer> res = new ArrayList<>();
// 记录数组元素是否已取走
boolean[][] flag = new boolean[m][n];
// 记录循环次数
int count = 0;
// 数组坐标(i,j)
int i = 0, j = 0;
// 用于判断方向
int fx = 0;
// 逆时针螺旋遍历
while (count < m * n) {
// 收集数据
res.add(matrix[i][j]);
// 标记
flag[i][j] = true;
// 记录循环次数
count++;
// 更新方向
if (fx == 0 && (i + 1 >= m || flag[i + 1][j])) {
// 向下 且 坐标 i + 1 超过行数(越界) 或者 数据已经被标记
fx++;
} else if (fx == 1 && (j + 1 >= n || flag[i][j + 1])) {
// 向右 且 坐标 j + 1 超过列数(越界) 或者 数据已经被标记
fx++;
} else if (fx == 2 && (i - 1 < 0 || flag[i - 1][j ])) {
fx++;
} else if (fx == 3 && (j - 1 < 0 || flag[i][j - 1])) {
fx = 0;
}
// 向下
if (fx == 0) i++;
// 向右
else if (fx == 1) j++;
// 向上
else if (fx == 2) i--;
// 向左
else if (fx == 3) j--;
}
// 结果数组
int[] nums = new int[m * n];
for (int k = 0; k < nums.length; k++) {
nums[k] = res.get(k);
}
// 返回结果
return nums;
}
}