LeetCode 59
本文最后更新于:2021年9月8日 晚上
LeetCode 59
概述
输入n,在n*n的矩阵中,从左上角开始,逆时针填入数字1-n2,然后输出矩阵
思路
-
首页,应该能知道这题是一个模拟题
-
手动模拟操作,可以发现,顺序上-右-下-左都是一样的,只是规模再变小。所以一次大循环里面,应该是把四个方向的任务完成。
-
还要注意的是边界的选取,因为上-右、右-下、下-左,均是存在一个重叠的数字的。这里选择左闭右开,是因为每次处理一个方向后,循环变量还会加一,
所以干脆直接将加一利用起来,再之后的方向继续使用,减少操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31vector<vector<int>> generateMatrix(int n) {
vector<vector<int> > result(n, vector<int>(n, 0));
int loop=n/2; //一次一圈,所以除2
int startx=0,starty=0; //记录起始位置
int i,j;
int ans=1; //数字增量
int offset=1; //相同循环操作的偏移量
while(loop--){
i=startx;
j=starty;
for(;j<n-offset+startx;j++) //注意j的范围是要有偏移量的
result[i][j]=ans++;
//因为采用左闭右开,所以j最后加出来的数,可以在下面的循环里直接用
for(;i<n-offset+startx;i++)
result[i][j]=ans++;
for(;j>starty;j--)
result[i][j]=ans++;
for(;i>startx;i--)
result[i][j]=ans++;
//下一轮作准备
startx++;
starty++; //起始位置改变
offset+=2; //偏移量改变
}
if (n%2) { //n是奇数,则存在一个正中间数会少loop一次,需要额外处理
result[n/2][n/2] = ans;
}
return result;
}
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!