子数组-对和

时间:2018-10-17 09:53:51

标签: c arrays algorithm

如何查找给定子数组的总和等于确定目标和的对数?

我尝试使用哈希表并找到sum-x和x的出现次数,x是子数组的第i个元素。

但是如何针对多个查询对其进行优化? 我们无法为每个多查询创建哈希表。

编辑:目标总和是相同的。我们继续从用户那里获取子数组的端点。

2 个答案:

答案 0 :(得分:1)

要开始讨论,如何预先计算所有结果,然后使它们有效地访问?

预先计算所有索引对<i, j>,其中a[i] + a[j] = sum可以在O(n)中离线执行,其中n是输入数组a的大小。

之后,您可以将预先计算的对存储在2d空间索引结构中(例如R-Tree或Quadtree)。

然后,子数组查询(start, end)对应于具有min = (start, start)max = (end, end)的2d索引上的范围查询(带有二次框)。

根据查询的范围,这应该可以在O(log m)中进行,其中m是对的总数。

答案 1 :(得分:0)

用于找到给定子数组的对数等于其目标总和的算法:

  1. 创建一个映射以存储数组中每个数字的频率。
  2. 对于每个元素,检查它是否可以与任何其他元素(除了自身!)组合以提供所需的总和。相应地增加计数器。
  3. 将数除以2并返回。(为什么?因为每对被计数两次)

编辑1: 这是我的python解决方案。也可以使用集合来完成。

s=set()
result=set()
for item in a:
    target=original_target-i
    if target not in s:
       s.add(i)
    else:
        result.add((i,target))
print(len(result))

注释集在python中作为哈希表实现,因此,除非负载系数太高,否则搜索将花费O(1)时间。因此总复杂度为O(n)