我正在运行以下代码,以从输入列表中获得两个数字的索引,其总和等于目标。
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)
在输入数组很小之前,它运行良好,但是当它增长到成千上万的数字时,内存限制已超出。我相信应该有其他一些优化的方法来实现它。
答案 0 :(得分:0)
好吧,因为我们不能拥有大于10 ^ 6或10 ^ 7的数组/连续内存块
如果我们具有多维数组,则数组大小将减小为Matrix [1000] [1000],以获取总计〜10 ^ 7个块
Itertools生成所有可能是指数对的对,并将其存储在集合中肯定会在时间和空间上溢出。
因此,解决方案将是在时间和内存复杂度上都改善算法。
解决此问题的一种方法是通过散列
基本思想是 A + B =目标,其中A,B是数组的元素
所以我们使用键=元素和值=索引来维护哈希表
并反复检查数组中是否存在B =目标-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)