1. 程式人生 > >【leetcode陣列和字串】螺旋矩陣

【leetcode陣列和字串】螺旋矩陣

給定一個包含 m x n 個元素的矩陣(m 行, n 列),請按照順時針螺旋順序,返回矩陣中的所有元素。

示例 1:

輸入:
[
[ 1, 2, 3 ],
[ 4, 5, 6 ],
[ 7, 8, 9 ]
]
輸出: [1,2,3,6,9,8,7,4,5]
示例 2:

輸入:
[
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12]
]
輸出: [1,2,3,4,8,12,11,10,9,5,6,7]

均為轉載摘錄

class Solution {
public:
    vector<int> spiralOrder(vector<
vector<int>>& matrix) { vector<int> res; int nr = matrix.size(); if(nr == 0) { return res; } int nc = matrix[0].size(); if(nc == 0) { return res; } /* 方向向量 */ vector<vector<int>> dirs{{0, 1}, {1, 0}, {0, -1}, {-1
, 0}}; /* 行/列分別可以移動多少步,初始時行可以移動列數步,列可以移動行數-1步 */ vector<int> steps{nc, nr - 1}; /* [ir, ic]記錄當前的位置,初始為[0, -1] */ int ir = 0; int ic = -1; /* idir記錄當前的方向,可以是0,1,2,3 */ int idir = 0; /* 如果當前方向上仍然可以移動,就繼續移動 */ while(steps[idir % 2]) {
/* idir % 2表示是水平還是垂直方向,steps[idir % 2]表示當前方向還可以移動多少步 */ for(int i = 0; i < steps[idir % 2]; ++i) { /* dirs[idir]表示當前方向 */ ir += dirs[idir][0]; ic += dirs[idir][1]; res.emplace_back(matrix[ir][ic]); } /* 每移動一個方向,對應剩餘步數減一 */ --steps[idir % 2]; /* 改變方向 */ idir = (idir + 1) % 4; } return res; } };

螺旋矩陣-變式

class Solution {
public:
    vector<vector<int>> generateMatrix(int n) {
        vector<vector<int>> res(n, vector<int>(n));
        if(n == 0)
            return res;

        vector<vector<int>> dirs{{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
        vector<int> steps{n, n - 1};
        int ir = 0;
        int ic = -1;
        int dir = 0;
        int num = 1;
        while(steps[dir % 2])
        {
            for(int i = 0; i < steps[dir % 2]; ++i)
            {
                ir += dirs[dir][0];
                ic += dirs[dir][1];
                /* 這裡改為賦值 */
                res[ir][ic] = num++;
            }
            --steps[dir % 2];
            dir = (dir + 1) % 4;
        }
        return res;
    }
};