最快的算法可以选择数字对

时间:2013-10-27 14:06:48

标签: python algorithm

问题:  给定N个整数[N <= 10 ^ 5],计算具有差值K的整数对。[K> 0且K <1e9]。 N个整数中的每一个都将大于0且至少K远离2 ^ 31-1(一切都可以用32位整数完成)。

第1行包含N&amp; K(整数)。 第二行包含N个集合。确保所有N个数字都是不同的。

现在问题来自hackerrank。我得到了一个问题的解决方案,但它不满足所有样本测试用例的时间限制。我不确定是否可以使用其他算法,但我没有想法。如果有人花一点时间检查我的代码并给出一两个提示,我们将非常感激。

temp = input()
temp = temp.split(" ")
N = int(temp[0])
K = int(temp[1])
num_array = input()
num_array = num_array.split(" ")
diff = 0
pairs= 0
i = 0
while(i < N):
    num_array[i] = int(num_array[i])
    i += 1
while(num_array != []):    
    j = 0
    while(j < (len(num_array)-1)):
        diff = abs(num_array[j+1] - num_array[0])
        if(diff == K):
            pairs += 1
        j += 1
    del num_array[0]
    if(len(num_array) == 1):
        break
print(pairs)

2 个答案:

答案 0 :(得分:5)

您可以按照以下步骤在近似线性时间内执行此操作:

所以,O(n)解决方案:

  1. 对于每个数字x,将其添加到哈希集H [x]
  2. 对于每个数字x,检查x-k是否在H中,如果是,则添加1以回答
  3. 或者在O(nlgn)

    中使用一些平衡结构(如基于树的集合)

    此解决方案基于整数不同的假设,如果不是,则需要存储元素已被添加到设置的次数&#34;而不是添加1来回答 - 添加H [x] * H [x + k]

    的乘积

    所以一般来说你带一些HashMap H用&#34;默认值0&#34;

    1. 对于每个数字x更新地图:H [x] = H [x] +1
    2. 对于每个数字x加上回答H [x] * H [xk](你不必检查它是否在地图中,因为如果不是,H [xk] = 0)< / LI>

      再次 - 使用hash-map的解决方案是O(n)并使用树映射O(nlgn)

      给定一组numbesr A和数字k(不同数字的解):

      H=set()
      ans=0
      for a in A: 
        H.add(a)
      for a in A: 
        if a-k in H: 
          ans+=1
      print ans
      

      或更短

      H=set(A)
      ans = sum(1 for a in A if a-k in H)
      print ans
      

答案 1 :(得分:2)

使用字典(哈希映射)。

步骤1:使用数组中的所有条目填充字典D. 第2步:计算字典中所有A [i] + k的出现次数。

Dictionary<int> dict = new Dictionary<int>();
foreach (int n in num_array) do dict.Add(n);
int solitions = 0;
foreach (int n in num_Array) do 
  if dict.contains(n+k) 
    solutions += 1;

填写字典是O(1),搜索也是O(1)。对数组中的每个元素执行O(n)。这是尽可能快的。

抱歉,你必须将它翻译成python。

编辑:与前一个相同的想法。很抱歉发布重复。我想删除我的副本为时已晚。