今日整体用时:2h
双指针法
核心逻辑:左侧开头设置指针,右侧结尾设置指针,双侧指针按照条件往中间移,指针碰到了就结束。
感想:需要两次循环的都可以想一想能不能通过设置双指针把两次循环变成一次循环。不管是快慢指针还是双指针,设置两次指针可以巧妙的在一次循环里指到两个位置从而降低循环次数。
题目链接:977. 有序数组的平方 - 力扣(LeetCode)
题目难度:简单
完成状态:一刷没做出来
完成时间:看完讲解5分钟做出来
此题目我出的问题:想到了双指针,但是一直在想用一个指针遍历完所有数据,另一个指针指向另一个数据,这样就造成题目解答一直是错的。也要想到可以两头同时往中间走,一个情况下左指针向中间走,另一个情况下右指针往中间走,最后两个指针相遇即停止。
滑动窗口
题目链接:209. 长度最小的子数组 - 力扣(LeetCode)
题目难度:中等
完成状态:一刷完成
完成时间:一刷15分钟做出来
感想:涉及长度的都可以想一想滑动窗口。
螺旋数组
题目链接:59. 螺旋矩阵 II - 力扣(LeetCode)
题目难度:中等
完成状态:一刷没做出来
完成时间:看完讲解后20分钟做出来
没做出来的原因:不知道每一次循环的边界怎么写,边界怎么调整以及怎么算停止
感想:
循环不变量:(1)每次循环的时候形式尽可能一致
(2)每次循环的其实和终止规则设置尽可能一致
(3)每次循环结束,变量发生改变时,变化规则尽可能一致
循环的重点就是找起始位置、终止位置、循环方向和步长
class Solution:
def generateMatrix(self, n: int) -> List[List[int]]:
'''
思路:
1. 每一次的循环由四个遍历步骤组成,一共要循环n//2次,即转n//2圈
2. 每一个遍历需要设置起始位置,终止位置
3. 在找每一次转圈的操作时,要尽量保证每一次转圈操作规则一致;每一次转圈内部的4个遍历,也要尽可能保证设置起始位置、终止位置规则一致,起始位置和终止位置在每一次遍历或者转圈结束发生变化时,也要保证变化规则尽量一直(循环不变量)
'''
matrix=[[0]*n for i in range(n)]
starti=0
startj=0
offset=1
number=1
for k in range(n//2):
for j in range(startj,n-offset):
matrix[starti][j]=number
number+=1
for i in range(starti,n-offset):
matrix[i][n-offset]=number
number+=1
for j in range(n-offset,startj,-1):
matrix[n-offset][j]=number
number+=1
for i in range(n-offset,starti,-1):
matrix[i][startj]=number
number+=1
starti+=1
startj+=1
offset+=1
if n%2 !=0:
matrix[n//2][n//2]=number
return matrix