解题思路:
大体上是从矩阵外圈一步一步向里面收缩,依次添加需要的元素,首先定义四个边界,即上界up、下届down、左边界left、右边界right。up的索引为0,down的索引为二维数组的行数-1,左界left为0,右界为二维数组的列数-1。
第一步从left遍历到right,up此时为0,之后将上边界up+1,如果up+1>down,则证明上下界有交接,则遍历结束。
第二步从up遍历到down,此时right为数组列数-1,之后将right-1,如果right-1<left,同理结束遍历。
第三步从right遍历到left,之后将down-1.如果down-1<up,则返回。
最后从down遍历到up,之后up+1,如果left+1>right,返回。
至此,外围循环结束,开始循环内部直至结束。
代码实现:
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer> res=new ArrayList<>();
if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
return res;
}
int m=matrix.length;//行数
int n=matrix[0].length;//列数
int up=0;//上边界
int down=m-1;//下边界
int left=0;//左边界
int right=n-1;//右边界
while(true)
{
for(int i=left;i<=right;i++)
{
res.add(matrix[up][i]);
}
if(++up>down) break;
for(int i=up;i<=down;i++)
{
res.add(matrix[i][right]);
}
if(--right<left) break;
for(int i=right;i>=left;i--)
{
res.add(matrix[down][i]);
}
if(--down<up) break;
for(int i=down;i>=up;i--)
{
res.add(matrix[i][left]);
}
if(++left>right) break;
}
return res;
}