刚好复习一下滑动窗口算法。只有做题才能融汇贯通嘛
滑动窗口学习算法链接:https://mp.weixin.qq.com/s/ioKXTMZufDECBUwRRp3zaA
方法一:
第一眼思路想到用O(n^2)的DP(动态规划算法)
形状为dp(num, num)
规律dp[i][j] = dp[i][j-1] + data[j]
方法二:
关于子串大名鼎鼎的双指针之——滑动窗口法呀!
直接上代码了
# -*- coding:utf-8 -*-
class Solution:
#DP
'''
def FindContinuousSequence(self, tsum):
# write code here
# 连续子和
# dp
dp = [[0]*(tsum) for i in range(tsum)]
#初始化dp
for i in range(tsum):
for j in range(tsum):
if i==j:
dp[i][j] = i+1
re = []
for i in range(tsum):
for j in range(i+1,tsum):
dp[i][j] = dp[i][j-1]+(j+1)
if dp[i][j] == tsum:
re.append(list(range(i+1, j+2)))
# 找到元素 并返回
return re
'''
# 滑动窗口解法
def FindContinuousSequence(self, tsum):
data = list(range(1,tsum+1))
left = right = 0
re = []
# 窗口元素之和 避免在判断中求sum(list) 这个也许是线性的。
num = 0
while left < tsum-1 and right<tsum: # 循环条件可以更加改进一点 left>(tsum-1)就可以退出了!
# 扩大窗口
num+=data[right]
right+=1
while num >= tsum and left < (right-1):#满足基本条件,和>tsum就可以缩小窗口了
if num == tsum: # 符合条件的结果
re.append(data[left:right])
break # 退出循环 每个窗口里肯定只有一种满足要求的结果
# 缩小窗口吧
num -= data[left]
left += 1
return re