题目描述:
给定一个包含 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]
这道题的描述很简单,就是按一定的顺序去遍历矩阵,但是遍历过程中的下标控制比较麻烦,有四种顺序,第一种是从左到右,之后从上到下,之后从右到左,之后从下到上。然后开始下一轮的遍历。首先需要计算出循环的次数,也比较简单,比如是m X n矩阵,循环次数为(Math.min(m,n)+1)/2。之后就是解决遍历中的下标问题,我们可以使用两个变量来分别记录本次循环中的矩阵大小,即第一次循环大小为m,n第二次为m-2,n-2。
代码实现:
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer> result = new ArrayList<Integer>();
if(matrix==null||matrix.length<1) return result;
int m = matrix.length;
int n = matrix[0].length;
int temp = (Math.min(m, n)+1)/2;
//m,n为本次循环得矩阵大小
for(int i=0;i<temp;i++,m-=2,n-=2) {
//第一次从左到右
for(int x=i;x<n+i;x++) {
result.add(matrix[i][x]);
}
//第二次从上到下
for(int y=i+1;y<m+i;y++) {
result.add(matrix[y][i+n-1]);
}
//如果m或n为1则矩阵只要一列或一行,可以跳出循环
if(n==1||m==1) break;
//从右到左
for(int x=i+n-2;x>=i;x--) {
result.add(matrix[i+m-1][x]);
}
//从下到上
for(int y=i+m-2;y>i;y--) {
result.add(matrix[y][i]);
}
}
for(Integer i:result) {
System.out.print(i+"\t");
}
return result;
}
}
特别提醒:如果需要多个循环得时候,尽量使每个循环是独立的,即不依赖于别的循环.