概述
题目
输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。
序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。
示例 1:
输入:target = 9
输出:[[2,3,4],[4,5]]
示例 2:
输入:target = 15
输出:[[1,2,3,4,5],[4,5,6],[7,8]]
限制:
1 <= target <= 10^5
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof
解法一
第一反应,双重循环暴力解法:
class Solution(object):
def findContinuousSequence(self, target):
"""
:type target: int
:rtype: List[List[int]]
"""
if target < 3:
return []
# 生成数组
nums = [i for i in range(1,target//2 + 2)]
print(nums)
res = []
for j in range(len(nums)):
for k in range(j+1, len(nums)):
if sum(nums[j:k+1]) == target:
res.append(nums[j:k+1])
return res
结果:超时。。。。
解法二
双指针 + 滑窗法
class Solution(object):
def findContinuousSequence(self, target):
"""
:type target: int
:rtype: List[List[int]]
"""
nums = [i for i in range(1,target//2 + 2)]
ans = []
low, high = 0, 1
while low < high and high < target//2+1:
if sum(nums[low:high+1]) == target:
ans.append(nums[low:high+1])
low += 1
elif sum(nums[low:high+1]) < target:
high += 1
else:
low += 1
return ans
但是太过于愚蠢了。。明明是1 2 3 4 5…这样的连续数字,我还要新生成一个数组做准备,并且使用sum()
函数,耗费时间。
解法三
滑动窗口
class Solution(object):
def findContinuousSequence(self, target):
"""
:type target: int
:rtype: List[List[int]]
"""
i = 1 # 滑动窗口的左边界
j = 1 # 滑动窗口的右边界
sum = 0 # 滑动窗口中数字的和
res = []
while i <= target // 2:
if sum < target:
# 右边界向右移动
sum += j
j += 1
elif sum > target:
# 左边界向右移动
sum -= i
i += 1
else:
# 记录结果
arr = list(range(i, j))
res.append(arr)
# 左边界向右移动
sum -= i
i += 1
return res
最后
以上就是生动咖啡豆为你收集整理的Leetcode - 和为s的连续正数序列的全部内容,希望文章能够帮你解决Leetcode - 和为s的连续正数序列所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复