19、顺时针打印矩阵
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
示例 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
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shun-shi-zhen-da-yin-ju-zhen-lcof
思路:
可以看出我们的规律是从起点出发往右开始走,然后下,左,上。再右边…重复。直到不能走为止。这一步是可以用一个小技巧定义一个上下左右走的坐标的。(看图解)
图解:
代码:
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<int> res;
if(matrix.empty()) return res; //LC特色
int n = matrix.size(), m = matrix[0].size(); //n是行数, m是列数
int dx[4] = {0, 1, 0,-1}, dy[4] = {1, 0, -1, 0}; //右下左上
int d = 0; //我们的方向控制变量 对照上面的方向,0是右,1下,2左,3上,然后重复
int x = 0, y = 0; //初始化坐标
vector<vector<bool>> st(n, vector<bool>(m, false)); //我们只要第一次搜索到的结果
for(int i = 0; i < n * m; i ++ ) {
res.push_back(matrix[x][y]); //将当前位置的元素加进答案
st[x][y] = true; //访问过了
int a = dx[d] + x, b = dy[d] + y; //开始控制方向
if(a < 0 || a >= n || b < 0 || b >= m || st[a][b]) { //如果坐标超出范围,或者已经访问过了,那么我们就更正我们的方向
d = (d + 1) % 4; //当我们方向控制变量超出4个方向后,我们要回到0这个方向
a = dx[d] + x, b = dy[d] + y; //纠正后需要重新赋值为正确的坐标
}
x = a, y = b; //更新坐标
}
return res;
}
};