题目简介
给你一个正整数 n ,生成一个包含 1 到 n * n 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
示例一
输入:n = 3
输出:[[1,2,3],[8,9,4],[7,6,5]]
示例二
输入:n = 4
输出:[[1,2,3,4],[12,13,14,5],[11,16,15,6],[10,9,8,7]]
示例三
输入:n = 1
输出:[[1]]
思想逻辑
- 实现:二维数组
- 逻辑:循环不变量原则
- 思想:对每一条边的处理规则要相同,左闭右开[ 0 、1、2 )
- 这里设定为:n == 4
- 上侧从左到右:start在二维数组第零行的位置上,stack不动,j++,不断给第零行且第零一二列赋值(1、2、3),当j == 3时,for循环停止,j当好卡在第零行第三列(0,3)上。
- 右侧从上到下:此时 i 蠢蠢欲动,当 i 得知 j 正卡在(0,3)的位置上不能动时,i 知道自己的机会来了,于是 i 开始往下跑,并没有忘记沿途放上元素(4,5,6)们,但 i 忘记了自己也最大 == 3,于是 i 也卡在了第三行第三列(3,3)上,i 不得不等 j 过来……
- 下侧从右到左:当 j 知道因为自己卡在第零行第三列(0,3)的位置上,而 i 舍弃自己而跑时,j 奋起往回追,打算来一波秦王绕柱,利用 i 与自己相差对角线的距离,投射放上元素(7,8,9),直到跑到第三行第零列(3,0)的位置上累的喘不过气才停下来。
- 左侧从下到上:i 没有看见 j 过来于是心里猜想(这小子估计是该原点哪堵我,刚才看见有三个元素飞了过去,哪它就是知道我的位置,你不仁就别怪我不义了!),于是 i 猜到 j 的位置之后,也往回走投射了(10、11)两个元素,但i不想j那么有活力走到第二行第零列就不走了。
剩下的自行脑部吧,博主该图书馆笑了一路,哈哈哈哈哈哈哈
代码如下
class Solution {
public int[][] generateMatrix(int n) {
int temp = 0;
int[][] numbers = new int[n][n];
int start = 0;
int count = 1;
int i, j;
while(temp++ < n / 2) {
//上侧从左到右:
for(j = start; j < n - temp; j++){
numbers[start][j] = count++;
}
//右侧从上到下:
for(i = start; i < n - temp; i++){
numbers[i][j] = count++;
}
//下侧从右到左:
for(; j >= temp; j--){
numbers[i][j] = count++;
}
//左侧从下到上:
for(; i >= temp; i--){
numbers[i][j] = count++;
}
start++;
}
if(n % 2 == 1){
numbers[start][start] = count;
}
return numbers;
}
}