问题: 给定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)
答案 0 :(得分:5)
您可以按照以下步骤在近似线性时间内执行此操作:
所以,O(n)解决方案:
或者在O(nlgn)
中使用一些平衡结构(如基于树的集合)此解决方案基于整数不同的假设,如果不是,则需要存储元素已被添加到设置的次数&#34;而不是添加1来回答 - 添加H [x] * H [x + k]
的乘积所以一般来说你带一些HashMap H用&#34;默认值0&#34;
再次 - 使用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。
编辑:与前一个相同的想法。很抱歉发布重复。我想删除我的副本为时已晚。