<aside> 💡
整体思路:设计四堵墙,靠着墙绕圈,碰到墙就拐弯
实现思路:四堵墙对应四个变量,另设一个变量控制前进方向
// 设计一个switch,判断此时在上下左右哪条边移动
// 注意一条边上的最后一个节点留给邻边(循环不变量,每条边都是左闭右开)
vector<vector<int>> generateMatrix(int n) {
vector<vector<int>> ans(n, vector<int>(n, 0));
char choice = 't'; // 模拟前进的方向,先从上边界开始走
int t = 0; // 上边界
int b = n - 1; // 下边界
int l = 0; // 左边界
int r = n - 1; // 右边界
int num = 1;
int i = 0, j = 0;
while (num <= n * n) {
ans[i][j] = num;
switch (choice) {
// 靠着顶边走
case 't': {
++j;
// 碰到墙就右拐,把上边往里缩一格,下面同理
if (j == r) {
choice = 'r';
++t;
}
break;
}
// 靠着右边走
case 'r': {
++i;
if (i == b) {
choice = 'b';
--r;
}
break;
}
// 靠着下边走
case 'b': {
--j;
if (j == l) {
choice = 'l';
--b;
}
break;
}
// 靠着左边走
case 'l': {
--i;
if (i == t) {
choice = 't';
++l;
}
break;
}
}
++num;
}
return ans;
}
<aside> 💡
卡哥的思路:定义一个大循环,每个循环走一圈。每个大循环中有四个小循环,每个小循环走一条边
实现重点:定义好循环不变量——每条边的变量规则都应相同(一条边上的最后一个节点留给邻边,即每条边都是左闭右开)
</aside>