![](/img/trans.png)
[英]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.