📅  最后修改于: 2023-12-03 15:10:41.898000             🧑  作者: Mango
给定两个整数数组 a
和 b
,以及整数 v
,你需要计算有多少对下标 (i,j)
满足 a[i] + b[j] = v
。
可以用哈希表来解决这个问题。具体做法是遍历数组 a
,将数组中的每个元素作为 v - b[j]
在哈希表中查找,如果找到了就计数器加上哈希表中该元素出现的次数,否则将该元素作为键值存入哈希表中,对应值为 1 。然后遍历数组 b
,做和数组 a
一样的操作即可。
Python 代码实现:
def get_count(a, b, v):
count = 0
dic = {}
for i in range(len(a)):
if v - a[i] in dic:
count += dic[v - a[i]]
if a[i] not in dic:
dic[a[i]] = 1
else:
dic[a[i]] += 1
for i in range(len(b)):
if v - b[i] in dic:
count += dic[v - b[i]]
if b[i] not in dic:
dic[b[i]] = 1
else:
dic[b[i]] += 1
return count
Java 代码实现:
public int getCount(int[] a, int[] b, int v) {
int count = 0;
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < a.length; i++) {
if (map.containsKey(v - a[i])) {
count += map.get(v - a[i]);
}
if (map.containsKey(a[i])) {
map.put(a[i], map.get(a[i]) + 1);
} else {
map.put(a[i], 1);
}
}
for (int i = 0; i < b.length; i++) {
if (map.containsKey(v - b[i])) {
count += map.get(v - b[i]);
}
if (map.containsKey(b[i])) {
map.put(b[i], map.get(b[i]) + 1);
} else {
map.put(b[i], 1);
}
}
return count;
}
算法的时间复杂度为 $O(n)$ ,其中 $n$ 为数组的长度,因为需要遍历数组两次,哈希表的插入和查找操作都是 $O(1)$ 的,所以不会增加时间复杂度。