使用python寻找求和组合,给定一个整数列表,查找列表中相加等于s的n个数字
时间: 2023-06-04 18:07:49 浏览: 115
蓝桥杯 数字游戏 python
,你有什么思路和方法吗?
对于这个问题,可以使用递归算法来解决。首先,定义一个函数来实现递归:
def findSum(lst, s, n):
# 如果n等于1,则直接返回s是否在lst中
if n == 1:
return s in lst
# 如果列表为空或者n大于列表长度,则返回False
if not lst or n > len(lst):
return False
# 遍历列表
for i, val in enumerate(lst):
# 跳过重复的数字
if i > 0 and lst[i] == lst[i-1]:
continue
# 递归查找是否有n-1个数字的和等于s减去当前值
if findSum(lst[i+1:], s-val, n-1):
return True
return False
然后,调用该函数来查找列表中相加等于s的n个数字:
def findNsum(lst, s, n):
# 排序列表
lst.sort()
# 如果列表中最小的n个数的和都大于s或者最大的n个数的和都小于s,则返回空列表
if sum(lst[:n]) > s or sum(lst[-n:]) < s:
return []
# 查找n个数字的和为s
for i in range(len(lst)-n+1):
# 跳过重复的数字
if i > 0 and lst[i] == lst[i-1]:
continue
# 如果当前数字与后面n-1个数字的和大于s,则直接返回结果
if lst[i] + sum(lst[i+1:i+n]) > s:
break
# 如果当前数字与后面n-1个数字的和等于s,则添加到结果中
if lst[i] + sum(lst[-n:]) == s:
return [lst[i]] + lst[-n:]
# 查找是否有n-1个数字的和等于s减去当前数字
if findSum(lst[i+1:], s-lst[i], n-1):
return [lst[i]] + findSum.lst
return []
该函数首先将列表进行排序,然后根据最小的n个数的和和最大的n个数的和来判断是否需要查找。如果需要查找,则遍历列表,如果当前数字与后面n-1个数字的和大于s,则直接返回结果;如果当前数字与后面n-1个数字的和等于s,则添加到结果中;否则查找是否有n-1个数字的和等于s减去当前数字。如果都没有找到,则返回空列表。
阅读全文