【解题思路】
本题需要按照要求,以顺时针的方式遍历数组的每个值,使用广度优先算法,选择当前节点上下左右未被遍历的值,加入到ans[]数组中,并标记该数据已被查找。设置一个dire[][]数组分别表示右、下、左、上四个方向,从上一个节点查找的方向开始,循环寻找{右、下、左、上}这四方向中第一个未被查找的节点,并沿着这个方向查找下去。当查找完数组数据总数次后,数组中全部值都被查找了,查找结束。
class Solution {
public int[] spiralOrder(int[][] matrix) {
int row = matrix.length;
if(row == 0)
{
return new int[0];
}
int col = matrix[0].length;
int len = row * col;
boolean[][] used = new boolean[row][col];
int[] ans = new int[len];
search(0, len, matrix, used, ans, 0, 0, row, col, 0);
return ans;
}
public void search(int num, int len, int[][] matrix, boolean[][] used, int[] ans, int curR, int curC, int row, int col, int dir)
{
int[][] dire = {{0,1},{1,0},{0,-1},{-1,0}};
if(num == len)
{
return;
}
else
{
ans[num] = matrix[curR][curC];
used[curR][curC] = true;
for(int i = dir; i < dir +4; i++)
{
int nextR = curR + dire[i%4][0];
int nextC = curC + dire[i%4][1];
if(nextR >= 0 && nextR < row && nextC >= 0 && nextC < col && !used[nextR][nextC])
{
search(num+1, len, matrix, used, ans, nextR, nextC, row, col, i%4);
break;
}
}
}
}
}