输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。
序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。
示例 1:
输入:target = 9
输出:[[2,3,4],[4,5]]
自己用的是二分法
class Solution:
def findContinuousSequence(self, target: int) -> List[List[int]]:
max_num = (target+1)//2
res = []
length = max_num-1
for a in range(1,max_num):
l = a+1
r = a+length
middle = (l+r)//2
while(l < r):
total = ((a+middle)*(middle-a+1))//2
if total < target:
l = middle + 1
middle = (l+r)//2
elif total > target:
r = middle - 1
middle = (l+r)//2
else:
break
if target == ((a+middle)*(middle-a+1))//2:
length = middle-a+1
res.append(list(range(a,middle+1)))
return res
B站学习的更为简单的方法
class Solution:
def findContinuousSequence(self, target: int) -> List[List[int]]:
max_num = (target+1)//2
l,r,total = 1,2,3
res = []
while(r <= max_num):
if total > target:
total -= l
l += 1
elif total < target:
r += 1
total += r
else:
res.append(list(range(l,r+1)))
r += 1
total += r
return res