给定两个数组,找到 n+m-1 个唯一的和对
分别给定大小为 N 和 M 的 2 个整数数组 A 和 B(每个数组中没有重复元素),形成 N + M – 1 对,每对都有两个数组中的一个元素,使得所有对的总和是唯一的.对于每一对,打印它们各自数组中元素的索引。
例子:
Input: N = 5, M = 3
A = [6, 5, 7, 1, 3]
B = [2, 4, 8]
Output: 2 0
2 1
2 2
3 0
4 0
1 0
0 0
We have to form 5 + 3 - 1 = 7 pairs. These pairs are:
(7, 2), (7, 4), (7, 8), (1, 2), (3, 2), (5, 2), (6, 2)
All have unique sum
蛮力方法:我们可以在数组 A 和 B 上运行一个循环来找到前 N+M-1 个唯一的和对,并一路打印它们的索引。
为了检查一个特定的总和是否已经被使用,我们制作了一个Python bool 字典。如果该总和的字典值为 False,则意味着它是一个新的总和值。如果为 True,则该总和已被使用。
代码:
from collections import defaultdict as dd
# Function to form unique sum pairs
def unique_pairs():
# Python Bool Dictionary
d = dd(bool)
ct = 0
# For every element of A, Find
# a unique sum pair in B. Break
# the loop after N + M-1 pairs
for i in range(n):
for j in range(m):
if(ct == n + m-1):
break
sm = a[i] + b[j]
if(d[sm] == False):
d[sm] = True
ct+= 1
print(i, j)
n, m = 6, 4
a = [ 6, 4, 3, 5, 8, 2 ]
b = [ 3, 5, 4, 2 ]
unique_pairs()
输出:
0 0
0 1
0 2
0 3
1 0
1 3
2 3
4 1
4 2
时间复杂度:由于我们使用嵌套循环遍历数组,因此时间复杂度为 O( )。
有效方法:一旦我们对两个数组进行排序,首先我们可以通过将数组 A 的所有元素与数组 B 的第一个元素配对,然后将数组 B 的其他 M-1 个元素与数组 B 的最后一个元素配对,来生成 N 个唯一的和对。数组 A。
代码:
from collections import defaultdict as dd
# Function to form unique sum pairs
def unique_pairs_sort():
# Python Int Dictionary
da = dd(int)
db = dd(int)
# Make a dictionary to store index
for i in range(n):
da[a[i]] = i
for i in range(m):
db[b[i]] = i
# Sorting the arrays
a.sort(); b.sort()
# N pairs of A with B[0]
for i in range(n):
print(da[a[i]], db[b[0]])
# M-1 pairs of B with A[N-1]
for i in range(1, m):
print(da[a[-1]], db[b[i]])
n, m = 6, 4
a = [ 6, 4, 3, 5, 8, 2 ]
b = [ 3, 5, 4, 2 ]
unique_pairs_sort()
输出:
5 3
2 3
1 3
3 3
0 3
4 3
4 0
4 2
4 1
时间复杂度:复杂度等于排序所需的时间:O(n Log n)。
空间复杂性:因为我们使用两个不同的地图/字典来存储数组的索引。时间复杂度为 O(n + m) ,其中 n 是第一个数组的大小,m 是第二个数组的大小。