给你一个 m
行 n
列的矩阵 matrix
,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
public:
const int dx[4] = {0, 1, 0, -1};//右,下,左,上
const int dy[4] = {1, 0, -1, 0};
vector<int> spiralOrder(vector<vector<int>>& matrix) {
int m = matrix.size();//行
int n = matrix[0].size();//列
int sum = m * n;
vector<int> res(sum, 0);
vector<vector<int>> flag(m, vector(n, 0));
int cnt = 0;
int x = 0, y = 0, d = 0;
for (int i = 0; i < sum; i++)
{
if (x + dx[d] >= m || x + dx[d] < 0 || y + dy[d] >= n || y + dy[d] < 0 ||
flag[x + dx[d]][y + dy[d]] == 1)
{
d = (d + 1) % 4;
}
res[cnt++] = matrix[x][y];
flag[x][y] = 1;
x += dx[d];
y += dy[d];
}
return res;
}
给你一个正整数 n
,生成一个包含 1
到 n2
所有元素,且元素按顺时针顺序螺旋排列的 n x n
正方形矩阵 matrix
。
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> res(n, vector<int>(n, 0));
int startX = 0, startY = 0;//每个圈的起始位置
int loop = n / 2;//有几个圈
int mid = n / 2;//矩阵中间的位置,如:n=3,中间位置:(1,1)
int cnt = 1;//用来给矩阵赋值
int offset = 1;//每一圈循环,需要控制每一条边遍历的长度
int i, j;
while (loop--)
{
i = startX;
j = startY;
for (j = startY; j < startY + n - offset; j++)
res[startX][j] = cnt++;
for (i = startX; i <startX + n - offset; i++)
res[i][startY + n - offset] = cnt++;
for (j = startY + n - offset; j > startY; j--)
res[startX + n - offset][j] = cnt++;
for (i = startX + n - offset; i > startX; i--)
res[i][startY] = cnt++;
startX++;
startY++;
offset += 2;
}
if (n % 2 == 1)
res[mid][mid] = cnt;
return res;
}