python - 查找具有预定义总和的子序列
问题描述
嘿stackoverflow社区,
我有以下问题。我有预定义的数字列表。例如
input_list = [2, 2, 2, 2, 2, 1, 1, -6, -6, -4, 3, 3, -8]
我不想尝试完成的是找到一个具有给定结果列表大小和结果列表总和的子集,以便每个结果列表都具有请求的大小和请求的总和。
例如:
>> get_all_sum_lists(input_list, size=3, sum=0)
[[2, 2, -4], [-6, 3, 3], ...]
>> get_all_sum_lists(input_list, size=2, sum=-1)
[[3, -4]]
>> get_all_sum_lists(input_list, size=1, sum=0)
[]
第一个想法:直接的解决方案是尝试每种组合,但这很糟糕。这最终会在 O(n^size) 第二个想法:这个问题有一些有趣的属性,如:
get_all_sum_lists(input_list, size=4, sum=3) in get_all_sum_lists(input_list, size=2, sum=1).extend(get_all_sum_lists(input_list, size=2, sum=2))
所以我认为递归或归纳之类的东西可以工作。但是我构建从 size=1 到请求大小的所有内容的想法导致与上述 O(n^size) 相同的复杂性
有人有一个复杂度较低的解决方案吗?
解决方案
使用 itertools 组合,您可以获得所需长度的子列表,然后您可以按总和过滤它们。不过我不确定性能,让我知道它是否体面:
import itertools
def f(list_, length_, sum_):
return list(set([i for i in itertools.combinations(list_, length_) if sum(i)==sum_]))
您的 input_list 示例:
f(input_list, 3, 0)
[(-6, 3, 3), (2, 2, -4), (1, -4, 3)]
f(input_list, 5, 10)
[(2, 2, 2, 1, 3), (2, 2, 2, 2, 2), (2, 1, 1, 3, 3)]
推荐阅读
- php - 将用户重定向到他们登录后离开的页面
- python - 即使安装了所有必需的软件包,Matplotlib 也没有安装
- python - 如何修复 PyCharm 在 Python 3.8 上给我的这个错误
- regex - 正则表达式匹配一个或两个,但不是两次
- html - laravel bootstrap-如何使用媒体查询来对齐每行的两个项目?
- flutter - 带有 onTouched 和 onReleased 回调的内置小部件?
- haskell - 级联绑定 (`>>=`) 运算符
- react-native - React Native 取消链接 Ios 库
- react-native - 对 React 导航版本 5 中的深层链接感到困惑
- android - 如何使用 Espresso 存根 Intent.createChooser Intent