class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> res(n,vector<int>(n,0));
int startx = 0, starty = 0;
int count = 1;
int loop = n / 2;
int mid = n / 2;
int offset = 1;
int i, j;
while (loop--) {
for (j = starty; j < n - offset + starty; j++) {
res[startx][j] = count++; //确定起始点
}
for (i = startx; i < n - offset + startx; i++) {
res[i][j] = count++;
}
for (; j > starty; j--) {
res[i][j] = count++;
}
for (; i > startx; i--) {
res[i][j] = count++;
}
startx++;
starty++;
offset += 2;
}
if (n % 2) res[mid][mid] = n * n;
return res;
}
};
时间复杂度:O(N2)
空间复杂度:O(N2)
注意点:需要确保每次遍历边时,区间都是开闭时相同的,例如我都用的是左闭右开,以免循环时把自己绕晕,此时定义个offset是用来确定每次循环的长度,即每次循环一次,一条边上有两个元素被遍历,所以要加二。最后就是中间元素单独考虑。
class Solution {
public:
vector<int> spiralOrder(vector<vector<int>>& matrix) {
int startx = 0;
int starty = 0;
int m = matrix.size();
int n = matrix[0].size();
int count = m * n;
int mid = (m < n ? m : n) / 2;
int loop = (m < n ? m : n) / 2;
vector<int> a(m * n, 0);
int temp = 0;
int i, j;
int offset = 1;
while (loop--) {
for (j = starty; j < n - offset + starty; j++) {
a[temp++] = matrix[startx][j];
}
for (i = startx; i < m - offset + startx; i++) {
a[temp++] = matrix[i][j];
}
for (j; j > startx; j--) {
a[temp++] = matrix[i][j];
}
for (i; i > starty; i--) {
a[temp++] = matrix[i][j];
}
startx++;
starty++;
offset += 2;
}
while (temp < m * n) {
if (m < n) {
a[temp++] = matrix[startx][starty];
starty++;
}
else if (m > n) {
a[temp++] = matrix[startx][starty];
startx++;
}
else {
a[temp++] = matrix[m / 2][n / 2];
}
}
return a;
}
};