1 题目描述
2 算法思路
思路:
- 顺时针打印的意思就是,将矩阵按照:从左至右,从上到下,从右到左,从下到上的顺序遍历
- 每次遍历结束,都对应的缩小边界
算法:
- 当矩阵为空时,直接返回空列表即可
- 初始化四个边界,左、右、上、下, l , r , t, b
- 循环打印,按照从左至右,从上到下,从右到左,从下到上的顺序遍历
- 将元素按照顺序添加到res
- 如果当前行(列)打印完,边界收缩1
- 如果边界相遇,就退出,代表打印完了
3 代码
class Solution {
public int[] spiralOrder(int[][] matrix) {
if(matrix.length == 0)
return new int[0];
int l = 0;
int r = matrix[0].length -1 ;
int t = 0;
int b = matrix.length - 1;
int[] res = new int[(r + 1)*(b + 1)]; //初始化数组
int index = 0;
while(true){
//从左到右
for(int i = l; i <= r; i++){
res[index++] = matrix[t][i];
}
if(++t > b) //判断能否从上到下
break;
//从上到下
for(int i = t; i <= b; i++){
res[index++] = matrix[i][r];
}
if(l > --r) //判断能否从右到左
break;
//从右到左
for(int i = r; i >= l; i--){
res[index++] = matrix[b][i];
}
if(t > --b) //判断能否/从下到上
break;
//从下到上
for(int i = b; i >= t; i--){
res[index++] = matrix[i][l];
}
if(++l > r)
break;
}
return res;
}
}