解法一:for,for解法, 时间复杂度O(N^2)
class Solution:
def FindContinuousSequence(self, tsum):
if tsum <= 1:
return []
newli = []
li = []
sum = 0
for i in range(1,tsum):
sum = 0
for j in range(i,tsum+1):
sum += j
if sum == tsum:
newli = range(i,j+1)
li.append(newli)
break
return li
解法二:滑动窗口 时间复杂度O(N) 据说类似于tcp的滑动窗口协议(?)
补充知识:tcp的滑动窗口协议
为增加网络吞吐量,将数据包一起发送过去,产生这个概念
思路:
①初始化两指针small =1,big = 2
②while循环,循环条件small<系列数的一半(数大于等于2,注意这里tsum+1,就是因为奇数)
②如果相加大于S,small后移;如果相加等于S,添加序列,big后移;小于,big后移动
class Solution:
def FindContinuousSequence(self, tsum):
if tsum < 3:
return
small = 1
big = 2
output = []
middle = (tsum + 1) >> 1
cursum = small + big
while small < middle:
if cursum == tsum:
output.append(range(small,big + 1))
big += 1
cursum += big
elif cursum > tsum:
cursum -= small
small += 1
else:
big += 1
cursum += big
return output
class Solution:
def findContinuousSequence(self, target: int) -> List[List[int]]:
i,j,sum,res=1,1,0,[]
while i <= target//2:
if sum == target:#Python range() 函数返回的是一个可迭代对象(类型是对象),而不是列表类型, 所以打印的时候不会打印列表
res.append(list(range(i, j)))
sum-=i
i+=1
elif sum < target:
sum+=j
j+=1
else:
sum-=i
i+=1
return res
解法三 :利用等差序列的特性 时间复杂度O(根号N)
思路:
很巧妙!
棒!根据这个地板除法,下面的代码还可以简化!注意边界!一不小心就错!
class Solution:
def FindContinuousSequence(self, tsum):
from math import sqrt# math模块
res = []
for div in range(2,int(sqrt(tsum*2))+1):# 明白时间复杂度来历了叭
if (div%2==0 and tsum%div == div/2) or (div%2==1 and tsum%div == 0):# n为偶数时,sum = n(i+0.5)
start = tsum//div - div//2 + 1 if div%2==0 else tsum//div - div//2
res.append(list(range(start, tsum//div + div//2 + 1)))# range在python3中返回的不再是一个list而是一个range对象
return sorted(res)