【问题标题】:Memory Limit Exceed - Python超出内存限制 - Python
【发布时间】:2018-11-19 11:47:13
【问题描述】:

我正在运行下面的代码,用于从输入列表中获取两个数字的索引,其总和等于目标。

import itertools

class Solution:
   def twoSum(self, nums, target):
        combs = set(itertools.combinations(enumerate(nums), 2))
        while combs:
           elem = combs.pop()
           if int(elem[0][1]) + int(elem[1][1]) == target:
               return [elem[0][0], elem[1][0]]

cls = Solution()
nums = [3,3]
lst = cls.twoSum(nums,6)
print(lst)

它运行良好,直到输入数组很小,但是当它增长到数千个时,内存限制超出。我相信应该有一些其他优化的方法来做到这一点。

【问题讨论】:

    标签: loops python-3.6


    【解决方案1】:

    因为我们不能拥有超过 10^6 或 10^7 的数组/连续内存块

    如果我们有多维数组大小将减少到 Matrix[1000][1000] 以获得总共 ~10^7 个块

    Itertools 生成所有可能的指数对,将其存储在集合中肯定会在时间和空间上溢出。

    所以解决这个问题的方法是提高算法的时间和内存复杂度。

    解决这个问题的方法之一是通过散列,

    基本思想是 A + B = 目标,其中 A,B 是数组的元素

    所以我们用 key = element 和 value = index 来维护哈希表

    并迭代查找 B = target - A, 是否存在于数组中,如果找到我们打印 (A,B) 的索引

    class Solution:
        def twoSum(self, nums, target):
            hashtable = dict() # key = number , value = index
            n = len(nums)
            lst = []
           for i in range(n):
    
               if(hashtable.get(target-nums[i],None) is None):
               # not found so update the hashtable
                   hashtable[nums[i]] = i
               else:
               # pair found
                   lst.append((hashtable[target-nums[i]],i))
    
            return lst
    
    cls = Solution()
    
    nums = [3,3]
    lst = cls.twoSum(nums,6)
    
    print(lst)
    

    【讨论】:

      猜你喜欢
      • 2019-11-07
      • 1970-01-01
      • 2019-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多