leetcode题目链接
思路:坚持循环不变量原则,取定区间为“左开右闭”
模拟顺时针画矩阵的过程:
- 填充上行从左到右
- 填充右列从上到下
- 填充下行从右到左
- 填充左列从下到上
每画一条边都要坚持一致的左闭右开(或者左开右闭)的原则,拐角处让给新的一条边来继续画
class Solution {
public:
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> res(n, vector<int>(n, 0)); // 使用vector定义一个二维数组
int startx = 0,starty = 0;
int loop = n / 2;
int i, j; //i为竖轴,j为横轴
int offset = 1; //留下最后一个空格给下一次循环
int mid = n / 2;
int count = 1;
while(loop--)
{
i = starty;
j = startx;
for(j; j < n - offset; j++)
{
res[i][j] = count;
count++;
}
for(i; i < n - offset; i++)
{
res[i][j] = count;
count++;
}
for(j; j > startx; j--)
{
res[i][j] = count;
count++;
}
for(i; i > starty; i--)
{
res[i][j] = count;
count++;
}
startx++;
starty++;
offset +=1 ;
}
if(n % 2 == 1)
{
res[mid][mid] = count;
}
return res;
}
};
时间复杂度 O(n^2): 模拟遍历二维矩阵的时间
空间复杂度 O(1)