簡體   English   中英

如何檢查給定數字是否是列表切片的總和?

[英]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 complexityspace 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM