每天晚上都会打原神,每日委托领取60原石,所以做完四个任务对我来说已经习惯了 今天又是上号的一天,每天刷四题目
委托1:
59. 螺旋矩阵 II
难度中等
1066
给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。
示例 1:
输入: n = 3
输出: [[1,2,3],[8,9,4],[7,6,5]]
代码如下
var generateMatrix = function (n) {
const matrix = new Array(n).fill().map(() => new Array(n).fill(0))
let top = 0
let left = 0
let right = n - 1
let bottom = n - 1
let num = 1
let dir = "right"
while (top <= bottom && left <= right) {
if (dir == "right") {
for (let i = left; i <= right; i++) {
matrix[top][i] = num++
}
top++
dir = "down"
}
if (dir == "down") {
for (let i = top; i <= bottom; i++) {
matrix[i][right] = num++
}
right--
dir = "left"
}
if (dir == "left") {
for (let i = right; i >= left; i--) {
matrix[bottom][i] = num++
}
bottom--
dir = "up"
}
if (dir == "up") {
for (let i = bottom; i >= top; i--) {
matrix[i][left] = num++
}
left++
dir = "right"
}
}
return matrix
}
说一下重要的概念,叫二维数组,有点像仓库队伍,班级,的行和列的概念,高深一点也叫矩阵matrix啦
1.第一步====== 搭架子
必背:1.新建一个n列n行的二维数组的公式:(新数组n行,填充0,map箭头新数组m列填充0)
const matrix = new Array(n).fill(0).map(()=>new Array(m).fill(0))
框架搭好后,下面就要进行第二步,定义变量啦 直接上图,这是我们搭的一个二维数组架子
2.第二步==========
新建变量,我们的目的是让变成
此时我们先明确,肯定是有for()循环遍历,num会++,我们就是要探究for(let i=什么;i<=还是>=什么;i++还是i--),无非就两种方向,
而且这个东西还跟n有关
此时答案呼之欲出
如果还不懂没关系,直接先看看有没有办法写一半
1234肯定能写出来
就是
for(let i=0;i<n;i++){ matrix[0][i]=num++ }
完成四分之一了吗?
那4567有没有办法呢?
for(let i=0;i<n;i++){ matrix[i][3]= num++ }
我们发现只要让每一列的第三项都递增就好了,这个时候变成num++
因此我们发现要存一个变量num记录一下++的规律
let num=1(一开始的时候),matrix[][]=num++
变成了这样
8910同理
for(let i=2;i>=0;i--){ matrix[3][i]= num++ }
1112也是
for(let i=2;i>=1;i--){ matrix[i][0]= num++ }
还能做13 14吗?
for(let i=1;i<n-1;i++){ matrix[1][i]=num++ }
此时我们发现一个规律,就是13,14和1234很像
i一开始不一样,取决于离左边有多远,那么我们就可以有变量let left = 0 i<也不一样,取决于离右边有多远,变量let right = n,n是4个的话,那么刚好是第一第二项 或者我们的<也可以改成<=,让let right - n-1,这样统一起来
这样我们变量就有了
let left= 0
let right = n-1
let top = 0
let bottom =n-1
let num = 1
还有一个,我们发现会有四种情况对应不同的遍历num++
因此
我们应该用四种if()某种条件下,对应四种情况
并且到头会改变这个变量
let dir = "left" 这时,我们用一个字符串说明方向,就得到这种情况
这要我们每次遍历后,dir="bottom"改变方向,继续遍历,同时还要记得top++,加上一个1,因为第一次1234头部用完后,top会少一个,这个对于我们做11,12的时候很重要,不会变成11,12,13覆盖掉原来1,
“dir”为“top”的时候的情况
for (let i = bottom; i >= top; i--) { matrix[i][left] = num++ } left++ dir = "right"
那个上下左右会一直轮回,我们就用while(条件){轮回} 那什么时候可以轮回呢?我们知道top,left会一直加,bottom,right会一直减,因此我们就让它 top>=bottom&&left>=right,才能继续轮回 如果有一天top++或者bottom--,bottom比top还大,那就不走了,所有应该执行完了。
大家最后要自己写一遍,肯定有很多细节错误的,记录下来,下次争取不犯错不踩坑,有什么不懂问问gpt哈哈哈!! 这是超基础详解了,觉得有用点个赞吧!!
委托结束,又是愉快的一天!!!下线!!