这道题目使用了滑动窗口的方法来解决。定义两个指针left和right,初始都指向序列的开始。然后逐步向右移动right指针,将对应的数加到当前窗口的和中(window)。如果窗口和大于目标值target,则逐步右移left指针,同时从window中减去相应的值,直到window小于等于target。如果在某一刻window等于target,当前的[left, right)范围内的数字就是一个有效的连续序列,我们将其记录下来。重复这个过程直到right到达序列的末尾。通过这种方式,可以找到所有符合条件的连续文件序列。
时间复杂度: O(n)
空间复杂度: O(n)
from typing import List
class Solution:
def findContinuousSequence(self, target: int) -> List[List[int]]:
left = 0 # 初始化左指针
right = 0 # 初始化右指针
window = 0 # 当前窗口的数字和
l = range(1, target//2+2) # 可能的数字范围
res = list() # 存储结果的列表
while right < len(l): # 当右指针没有超出范围时
c = l[right] # 取得当前右指针指向的值
right += 1 # 右指针右移
window += c # 更新窗口和
while window >= target: # 当窗口和不小于目标时调整左指针
if window == target:
res.append(list(l[left:right])) # 如果窗口和等于目标,则记录结果
d = l[left] # 取得当前左指针指向的值
left += 1 # 左指针右移
window -= d # 更新窗口和
return res # 返回结果
if __name__ == '__main__':
s = Solution()
print(s.findContinuousSequence(15)) # 测试示例