【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;
}
};