文档讲解:代码随想录
视频讲解:代码随想录
状态:完成2道题
滑动窗口
滑动窗口:两个指针一前一后组成滑动窗口,并计算滑动窗口中的元素的问题
适用场景:字符串匹配问题、子数组问题、定长问题
滑动窗口模板:
如果一个字符进入窗口,应该增加windows计数器;
如果一个字符将移除窗口的时候,应该减少windows计数器
当 valid 满足need时应该收缩窗口;应该在收缩窗口的时候更新最终结果。
在套用模板时,我们只需要思考以下四个问题:
1、当移动right扩大窗口,即加入字符时,应该更新哪些数据?
2、什么条件下,窗口应该暂停扩大,开始移动left缩小窗口?
3、当移动left缩小窗口,即溢出字符时,应该更新哪些数据?
4、我们要的结果应该在扩大窗口时还是缩小窗口时进行更新?
"""
left, right = 0, 0
count = 0
s = "abc"
while right < len(s):
# c是将移入窗口的字符
c = s[right]
# 右移窗口
right += 1
# 进行窗口内数据的一系列更新
# 判断左侧窗口是否要收缩
while (windows needs shrink):
# d 是将移除窗口的字符
d = s[left]
# 左移窗口
left += 1
# 进行窗口内数据的一系列更新
"""
209.长度最小的子数组
滑动窗口思路:根据题意可知,要求我们统计窗口内元素之和total>=target的最小长度。
需要用到的变量:left、right、total(统计窗口内的元素之和)和res(返回最终结果)
def minSubArrayLen(target, nums):
if nums is None or len(nums) == 0:
return 0
left, right = 0, 0
total = 0
res = len(nums) + 1 # 这是最终要返回的结果,为了避免出现示例3的情况,定义的长度比数组长度大1即可
while right < len(nums):
total += nums[right] # 把元素加入到窗口中去
while total >= target:
res = min(res, right - left + 1) # 1.对符合要求的长度进行比对,取最小值
total -= nums[left] # 2.移除窗口最左侧的元素
left += 1 # 3.左指针向右移动
right += 1
if res == len(nums) + 1:
return 0
else:
return res
59.螺旋矩阵II
把n=3、4、5、6时的螺旋矩阵画一下,方便理解,左上角为坐标原点
数组[i,j]中i表示行,j表示列,所以在数学上沿着x轴递增的话在数组就是j在递增
def generateMatrix(n):
nums = [[0] * n for _ in range(n)]
startx, starty = 0, 0 # 起始点
loop = n // 2 # 圈数
mid = n // 2 # 矩阵的中心点
count = 1 # 计数
for offset in range(1, loop + 1): # 每循环一层偏移量加1,偏移量从1开始
for j in range(starty, n - offset): # 顶部:从左至右,左闭右开
nums[startx][j] = count
for i in range(startx, n - offset): # 右侧:从上至下
nums[i][n - offset] = count
count += 1
for j in range(n - offset, starty, -1): # 底部:从右至左
nums[n - offset][j] = count
count += 1
for i in range(n - offset, startx, -1): # 左侧:从下至上
nums[i][starty] = count
count += 1
startx += 1 # 更新起始点
starty += 1
if n % 2 != 0: # n为奇数时,填充中心点
nums[mid][mid] = count
return nums
标签:count,right,59,nums,209,随想录,offset,窗口,left
From: https://blog.csdn.net/weixin_40702604/article/details/143770356