1 题目描述
2 解题思路
根据题目示例 matrix = [[1,2,3],[4,5,6],[7,8,9]] 的对应输出 [1,2,3,6,9,8,7,4,5]
可以发现,顺时针打印矩阵的顺序是 “从左向右、从上向下、从右向左、从下向上” 循环。
因此,考虑设定矩阵的“左、上、右、下”四个边界,模拟以上矩阵遍历顺序。
算法流程:
- 空值处理: 当 matrix 为空时,直接返回空列表 [] 即可。
- 初始化: 矩阵 左、右、上、下 四个边界 l , r , t , b ,用于打印的结果列表 res 。
- 循环打印: “从左向右、从上向下、从右向左、从下向上” 四个方向循环,每个方向打印中做以下三件事 (各方向的具体信息见下表);
1)根据边界打印,即将元素按顺序添加至列表 res 尾部;
2) 边界向内收缩 1 (代表已被打印);
3)判断是否打印完毕(边界是否相遇),若打印完毕则跳出。 - 返回值: 返回 res 即可。
鉴于对上面表格的理解,自己总结出了边界条件和遍历到的值,画出下面的图片方便理解
作者:jyd
链接:https://leetcode-cn.com/problems/shun-shi-zhen-da-yin-ju-zhen-lcof/solution/mian-shi-ti-29-shun-shi-zhen-da-yin-ju-zhen-she-di/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
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 x = 0;
int[] res = new int[(r + 1)*(b + 1)];
while(true) {
// left to right.
for(int i = l; i <= r; i++) res[x++] = matrix[t][i];
if(++t > b) break; //break是跳出上层循环,也就是说,四个条件有一个不满足,就结束循环了
// top to bottom.
for(int i = t; i <= b; i++) res[x++] = matrix[i][r];
if(l > --r) break;
// right to left.
for(int i = r; i >= l; i--) res[x++] = matrix[b][i];
if(t > --b) break;
// bottom to top.
for(int i = b; i >= t; i--) res[x++] = matrix[i][l];
if(++l > r) break;
}
return res;
}
}