繁体   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