【问题标题】:Time limit exceed error when using a list but works when using set for Leetcode problem in python使用列表时时间限制超出错误,但在 python 中使用 set 解决 Leetcode 问题时有效
【发布时间】:2021-04-20 07:58:34
【问题描述】:

我正在解决一个 leetcode 问题以在链表中找到交点。当我使用列表时,它给了我时间限制超出错误,但是当我使用 set 时,它给了我答案。由于 LinkedList 中的每个节点都是不同的,因此 set 和 list 将具有相同的元素

下面是我的代码

def getIntersectionNode(self, headA: ListNode, headB: ListNode):
        nodes = set()
        while headA != None:
            nodes.add(headA)
            headA = headA.next

        while headB != None:
            if headB in nodes:
                return headB
            headB = headB.next
        return None

使用list而不是set时出现错误的原因是什么。

【问题讨论】:

    标签: python python-3.x linked-list set


    【解决方案1】:

    在 python 中,set 可以更快地检查它们是否包含某个元素。 如果nodes 是一个集合,下面会更快。

    if headB in nodes:
    

    但是例如迭代一个集合会比迭代一个列表慢。

    【讨论】:

      【解决方案2】:

      in 运算符对集合和列表的实现方式不同。

      • 对于列表,代码必须遍历整个列表以检查每个元素,这可能是线性时间操作。

      • 对于一个集合,代码使用其哈希码在恒定时间内(平均)检查给定元素是否存在。

      假设 A 有 m 个节点,B 有 n 个节点,并且列表不相交(最坏情况)。如果nodes 是一个列表,那么算法将不得不为 B 中的每个 节点迭代 A 的所有节点,给出的时间复杂度为 Θ(m×n)。相比之下,当使用集合时,时间复杂度将为 Θ(m+n)。对于较大的 m 和 n 值,这会对函数的运行时间产生很大影响。

      这里有一些关于哈希表(Python 的 set 和 dict 数据结构的基础)如何工作的参考资料:

      【讨论】:

      • @AjinkyaGadgil 不客气!如果这回答了您的问题,您可以单击答案旁边的“复选标记”将问题标记为已解决。
      • 我有一个问题。该集合究竟如何检查更大的列表?
      • 这是一个复杂的问题,我将在我的回答中添加一个参考,以便您了解哈希表的工作原理。
      • 谢谢。我会检查链接。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-08-24
      • 1970-01-01
      • 2022-12-03
      • 1970-01-01
      • 2019-03-03
      • 1970-01-01
      • 2022-11-18
      相关资源
      最近更新 更多