输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
示例 1:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]
示例 2:
输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]
限制:
0 <= matrix.length <= 100
0 <= matrix[i].length <= 100
思路:
循环打印: “从左向右、从上向下、从右向左、从下向上” 四个方向循环
初始条件:
设置四个边界,l(left),r(right),t(top),b(bottom)
int l = 0; //左边界
int r = matrix[0].size() - 1; //右边界
int t = 0; //上边界
int b = matrix.size() - 1; //下边界
循环内容:
1.打印该行(列)的矩阵元素
2.打印完收缩边界,判断下一列(行)是否存在,存在则继续,不存在直接结束
3.判断条件:收缩后依然满足:left < right && top < bottom
例如:
1 2 3
4 5 6
7 8 9
第一轮循环
从左向右:1 2 3
从上向下:6 9
从右向左:8 7
从下向上:4
第二轮循环
从左向右:5
当从左向右打印完 1 2 3后,++t 缩小上边界,判断是否大于 下边界 b,不大于则说明下一列存在,因此以此时收缩后的上边界作为列起始点,开始从上向下列的打印,打印结果 6 9
代码实现:
class Solution
{
public:
vector<int> spiralOrder(vector<vector<int>>& matrix)
{
if (matrix.empty()) return {};
vector<int> res;
int l = 0; //左边界
int r = matrix[0].size() - 1; //右边界
int t = 0; //上边界
int b = matrix.size() - 1; //下边界
while (true)
{
//left -> right
for (int i = l; i <= r; i++) res.push_back(matrix[t][i]);
if (++t > b) break;
//top -> bottom
for (int i = t; i <= b; i++) res.push_back(matrix[i][r]);
if (--r < l) break;
//right -> left
for (int i = r; i >= l; i--) res.push_back(matrix[b][i]);
if (--b < t) break;
//bottom -> top
for (int i = b; i >= t; i--) res.push_back(matrix[i][l]);
if (++l > r) break;
}
return res;
}
};