📅  最后修改于: 2023-12-03 14:58:17.734000             🧑  作者: Mango
这是GATE 2017 MOCK II的第64章的题目解析和解答。本章主要考察了程序员的算法分析和设计能力,难度较高。
给定一个数组arr
和一个整数k
,请你找出数组中所有的满足条件 $arr[i]-arr[j] = k$ 的数对 $(i, j)$,其中 $i>j$。
第一行包含一个整数 $n$,表示数组中元素的个数。
接下来一行,包含 $n$ 个整数,表示数组的元素。
最后一行,包含一个整数 $k$。
输出所有满足条件的数对,每个数对占一行,第一个数表示 $i$,第二个数表示 $j$,用空格隔开。
5
1 5 3 4 2
2
1 4
2 5
如果直接暴力枚举数组中的每个数对 $(i, j)$,时间复杂度将会是 $O(n^2)$,无法通过本题。因此,我们需要优化算法。
我们可以使用哈希表来优化算法。具体来说,我们可以从左到右遍历数组 arr
,维护一个哈希表 m
,其中键值为数组的元素,值为该元素在数组中的下标。对于每个位置 $i$,我们在哈希表中查找是否存在键值为 arr[i] - k
的项,如果存在,就说明我们找到了一个满足条件的数对 $(i, j)$,其中 $j$ 为键值为 arr[i] - k
的项对应的值。
def find_pairs(arr, k):
m = {}
for i in range(len(arr)):
if arr[i] not in m:
m[arr[i]] = i
if arr[i] - k in m:
j = m[arr[i] - k]
if i > j:
print(i, j)
n = int(input())
arr = list(map(int, input().split()))
k = int(input())
find_pairs(arr, k)
该算法的时间复杂度为 $O(n)$。