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 提交记录