【leetcode陣列和字串】螺旋矩陣
阿新 • • 發佈:2018-12-08
給定一個包含 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;
}
};