LeetCode 59:螺旋矩阵Ⅱ python(边界收缩)
这个题目真的是把自己卡死,中间尝试了好多方法都不完美,看了很多大神的讲解,也迷迷糊糊,终于啃了两天之后,彻彻底底搞明白了!!
一、题目
题目传送门 — https://leetcode-cn.com/problems/spiral-matrix-ii/
二、解析
这个题目有点绕,从定义变量,定义二维列表,到一圈一圈向内旋转填充数字,再到最后的边界确定每一步都在卡我,脑子要没掉!!
1.二维的列表
定义二维列表:matrix = [[0 for _ in range(n)] for _ in range(n)]
2.四个边围成一圈
每个边的情况如下
①从左往右➡:行不变,列增加
②从上到下⬇:列不变,行增加
③从右往左⬅:行不变,列减小
④从下往上⬆:列不变,行减小
确定这个规律之后,4个循环可以搞定
3.确定循环边界
循环内设置一个变量 i 的值来代表变化的那个下标,循环结束之后不变的那个下标向内收缩 1
确定每个for循环的边界:定义4个变量来控制上下左右四个边界,分别时top,bottom,left,right
第一个循环从左往右➡,上边行用top,列增加:列范围就是从左到右[left,right],转换成pytho语言就是for i in range(left,right+1,1),这里right+1是因为range的范围是左闭右开,所以+1之后才可以完整的到最右边。最后的1即每次循环,i+1。在本次循环结束之后,top+1,即上方一条边循环结束上边界向下收缩1。
#从左往右,行不变,列增加
for i in range(left,right+1):
matrix[top][i] = num
num += 1
top += 1
第二个循环从上到下⬇,到右边了列用right,行增加:行范围就是从上到下[top,bottom],转换成pytho语言就是for i in range(top,bottom,1),在本次循环结束之后,right-1,即右方一条边循环结束右边界向左收缩1。