54. 螺旋矩阵
给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。
示例 1:
输入: [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ] 输出:
[1,2,3,6,9,8,7,4,5]
思路是 方向数组 + 边界调整
代码如下:
class Solution {
public:
int dir[4][2] = {
{
0,1},{
1,0},{
0,-1},{
-1,0}};
void matain(int &x,int &y,int &k,int &l,int m,int n) {
if(y == m - l) {
--y,++x,++k;}
if(x == n - l) {
--x,--y,++k;}
if(y == l - 1) {
++y,--x,++k;}
if(x == l && y == l) {
++l,x = y = l,k = 0;}
}
vector<int> spiralOrder(vector<vector<int>>& matrix) {
vector<int> ans;
if(matrix.size() == 0)return ans;
int m = matrix[0].size(),n = matrix.size();
int x = 0,y = 0,k = 0,l = 0,i = m * n;
while(i --) {
ans.push_back(matrix[x][y]);
x += dir[k][0];
y += dir[k][1];
matain(x,y,k,l,m,n);
}
return ans;
}
};
主函数就是确定循环次数,m * n 个元素,自然循环m * n 次了
然后 k 代表哪个方向,
k = 0 : 向右 , k = 1: 向下,k = 2 : 向左,k = 3 : 向上;
l 代表第几圈,也是循环时候的边界啦
l <= x < m - l , l <= y < n - l
当x 或 y 超出了边界的时候就进行相应的调整就好
最后当x,y 又循环到了最初的起点(l , l ) 的时候就意味着需要进行下一圈的循环啦,调整一下子:)
我的提交执行用时
已经战胜 89.28 % 的 cpp 提交记录