📅  最后修改于: 2023-12-03 14:55:55.417000             🧑  作者: Mango
给定一个整数数组nums和一个整数k,找到由每个元素恰好出现两次,并且两个元素之间的距离为k的所有组合。返回结果中不需要考虑元素的顺序。
首先将数组按序号和值两个因素存储在一个字典中,然后遍历一次数组,依次存储每个元素的下标。
接下来,遍历一次数组,对于每个元素找到另一个能够与它组合的元素。由于每个元素只能出现两次,因此我们需要确保任何一个元素仅仅参与一次组合。如果某个元素的值为x,它在下标列表idx中出现的位置为i和j,那么我们需要找到元素值为x的另一个出现位置i'和j',它们应该满足以下条件之一:
注意,如果i和j不满足要求,那么i'和j'也必须不满足要求。这是因为如果i和j已经参与了一个组合,那么i'和j'就不能与其它的元素再次组合了。
最后,我们将构成组合的元素的下标存储在一个二维列表中,返回结果。
def find_pairs(nums, k):
idx_dict = {}
for i, num in enumerate(nums):
idx_dict.setdefault(num, []).append(i)
res = []
for i, num in enumerate(nums):
if len(idx_dict[num]) >= 2:
j = idx_dict[num][1]
if j - i == k:
res.append([i, j])
if j - i > k:
break
for j in idx_dict[num]:
if j == i:
continue
if abs(j - i) == k:
res.append([i, j])
elif j - i > k:
break
return res
输入:
nums = [3, 1, 4, 1, 5]
k = 2
输出:
[[1, 3], [3, 1]]
该算法的时间复杂度为O(n),其中n是数组的长度。我们只需要遍历一次数组,就可以找到所有的组合。