LeetCode 54 螺旋矩阵
给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。
示例 1:
输入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
输出:
[1,2,3,6,9,8,7,4,5]
示例 2:
输入:
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12]
]
输出:
[1,2,3,4,8,12,11,10,9,5,6,7]
解题思路:
所谓螺旋遍历,就是顺时针一层一层地从外向内遍历。我们可以按照抽丝剥茧的方法来进行。这里面重要的是代码细节的处理,尤其是边界的处理,很容易产生越界的错误。下面的代码,我会在关键的地方进行注释解释。
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
//定义保存最终结果的集合
List<Integer> list=new ArrayList<>();
//处理矩阵边界情况
if(matrix==null || matrix.length==0) return list;
//矩阵的行,注意这里行的定义从0开始
int row=matrix.length-1;
//矩阵的列,同样也是从0开始
int column=matrix[0].length-1;
//r是记录在进行螺旋遍历的过程中所遍历的行
int r=0;
//c是记录在进行螺旋遍历的过程中所遍历的列
int c=0;
//定义大的循环体
while(r<=row && c<=column){
//首先遍历的是最上面的一行
for(int i=c;i<=column;i++){
list.add(matrix[r][i]);
}
//遍历最右边的一列
for(int j=r+1;j<=row;j++){
list.add(matrix[j][column]);
}
//遍历最下面和最左边的一列
if(r<row && c<column){
//k>=c很关键,因为我们遍历的过程中,
//c的值记录的是当前遍历到的列,会随着遍历的增加而递增
for(int k=column-1;k>=c;k--){
list.add(matrix[row][k]);
}
//最左边的一列
for(int m=row-1;m>r;m--){ //m>r的原因上同
list.add(matrix[m][c]);
}
}
r++;
row--;
c++;
column--;
}
return list;
}
}