剑指 Offer 29. 顺时针打印矩阵
题解
首先定义四个变量left,right,top,bottom代表左右上下四个边界,依次从左向右遍历,然后边界值缩进,从上向下,从右向左,从下向上以此类推直到边界条件不满足跳出。
算法流程:
- 空值处理: 当 matrix 为空时,直接返回空列表 [] 即可。
- 初始化: 矩阵 左、右、上、下 四个边界 l , r , t , b,用于打印的结果列表 res 。
- 循环打印: “从左向右、从上向下、从右向左、从下向上” 四个方向循环,每个方向打印中做以下三件事(各方向的具体信息见下表) ;
1>.根据边界打印,即将元素按顺序添加至列表 res 尾部;
2>边界向内收缩 11 (代表已被打印);
3>判断是否打印完毕(边界是否相遇),若打印完毕则跳出。 返回值: -
- 返回 res 即可.
代码实现:
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
if (matrix.empty())
return {};
vector<int> res;
int left = 0; //左边界
int right = matrix[0].size() - 1; //右边界
int top = 0; //上边界
int bottom = matrix.size() - 1; //下边界
while (true)
{
//left -> right
for(int i = left; i <= right; i++)
res.push_back(matrix[top][i]);
if(++top > bottom)
break;
//top -> bottom
for(int i = top; i <= bottom; i++)
res.push_back(matrix[i][right]);
if(--right < left)
break;
//right -> left
for(int i = right; i >= left; i--)
res.push_back(matrix[bottom][i]);
if(--bottom < top)
break;
//bottom -> top
for(int i = bottom; i >= top; i--)
res.push_back(matrix[i][left]);
if(++left > right)
break;
}
return res;
}
};