题目描述:
输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。
序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。
示例 1:
输入:target = 9
输出:[[2,3,4],[4,5]]
示例 2:
输入:target = 15
输出:[[1,2,3,4,5],[4,5,6],[7,8]]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
代码:
class Solution:
def findContinuousSequence(self, target: int) -> List[List[int]]:
l, r, n = 0, 1, (target+1)//2 + 1
if n <= 2: return []
nums = [i for i in range(1, n)]
out = []
# print(nums)
res = nums[0] + nums[1]
while True:
if res == target:#等于目标值,加入输出,但是还是要尝试右移
out.append(nums[l:r+1])
r += 1
if r < n-1:
res += nums[r]
else:
break
elif res < target:#小于目标值,右移
r += 1
if r < n-1:
res += nums[r]
else:
break
else:#大于目标值,左移
res -= nums[l]
l += 1
# print(out)
return out
思路:
因为要输出的是连续的正数数列,所以这个题目可以采用滑动窗口的思想。
当窗口的和小于target时,窗口的和需要增加,因此右边界®需要向右移动;
当窗口的和大于tatget时,窗口的和需要减小,因此左边界(l)需要向右移动;
当窗口的和恰好等于target时,记录下此时的结果[i,j],这是第一个也是唯一一个以i开头的序列,接下来再找i+1开头的序列,将窗口的左边界向右移动。