[英]Given a list of integers how do I check if it is possible to get 2 sublists of equal sum?
[英]How do I check if the given number is the sum of a list slice?
我有一个python
list
由整数组成。 我需要找出给定的数字是否为sum(mylist[some slice])
a = [1, 2, 2, 3, 3, 5, 5, 6, 6]
num = 22
Answer will be either [3, 3, 5, 5, 6] or [5, 5, 6, 6]
#'.' sum([3, 3, 5, 5, 6]) == 22 || sum([5, 5, 6, 6]) == 22
到目前为止,我已经做了类似递归的方法。 注意:我得到了预期的 output
def find_slice(mylist, num, extra=2):
if len(mylist) == 0:
return None
for i in range( len(mylist )-1):
if sum( mylist[:extra + i] ) == num:
return mylist[ :extra + i]
return find_slice(mylist[1:], num, extra+1)
>>> a = [1, 2, 2, 3, 3, 5, 5, 6, 6]
>>> print(find_slice(a, 22))
[3, 3, 5, 5, 6]
就时间复杂度而言,它需要O(n!)
(N factorial) 。
如何在time complexity
和space complexity
方面进行修改? 或者有没有更好的方法?
您可以在迭代项目时使用 window :
a = [1, 2, 2, 3, 3, 5, 5, 6, 6]
num = 22
def find_slice(mylist, num):
window = []
for e in a:
window.append(e)
s = sum(window)
if s > num:
window.pop(0)
while sum(window) > num:
window.pop(0)
s = sum(window)
if s == num:
return window
print(find_slice(a, num))
# [3, 3, 5, 5, 6]
这将是 O(n) 时间复杂度和 O(n) 空间
添加到@kederrac 的滑动 window 解决方案中,值得一提的是,使用pop(0)
第一项是O(N)
,而使用pop(-1)
从末尾弹出最后一项是O(1)
。 我们可以在时间复杂度 - Python Wiki中看到这种比较。
我们可以使用popleft
中的collections.deque
弹出第一项O(1)
:
从双端队列的左侧移除并返回一个元素。 如果不存在任何元素,则引发 IndexError。
修改后的代码:
from collections import deque
a = [1, 2, 2, 3, 3, 5, 5, 6, 6]
num = 22
def find_slice(mylist, num):
window = deque()
for e in a:
window.append(e)
s = sum(window)
if s > num:
window.popleft()
while sum(window) > num:
window.popleft()
s = sum(window)
if s == num:
return window
print(list(find_slice(a, num)))
# [3, 3, 5, 5, 6]
上面的解决方案现在应该约为O(N * W)
,其中N
是列表中的元素数, W
是 window 大小。 我不认为你能得到比这更好的了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.