793. 多个数组的交集
中文
English
给出多个数组,求它们的交集。输出他们交集的大小。
样例
样例 1:
输入: [[1,2,3],[3,4,5],[3,9,10]]
输出: 1
解释:
只有3出现在三个数组中。
样例 2:
输入: [[1,2,3,4],[1,2,5,6,7][9,10,1,5,2,3]]
输出: 2
解释:
交集是[1,2].
注意事项
- 输入的所有数组元素总数不超过
500000。 - 题目数据每个数组里的元素没有重复。
import heapq
class Solution:
"""
@param arrs: the arrays
@return: the number of the intersection of the arrays
"""
def intersectionOfArrays(self, arrs):
# write your code here
q = []
for i, arr in enumerate(arrs):
if arr:
arr.sort()
heapq.heappush(q, (arrs[i][0], i, 0))
ans = 0
prev = float('inf')
cnt = 1
while q:
val, i, j = heapq.heappop(q)
if val == prev:
cnt += 1
if cnt == len(arrs):
ans += 1
else:
prev = val
cnt = 1
if j+1 < len(arrs[i]):
heapq.heappush(q, (arrs[i][j+1], i, j+1))
return ans
此外,还可以使用 二路归并的做法:
import heapq
class Solution:
"""
@param arrs: the arrays
@return: the number of the intersection of the arrays
"""
def intersectionOfArrays(self, arrs):
# write your code here
def intersect2(arr1, arr2):
return list(set(arr1) & set(arr2))
def intersect(arr, l, r):
if l == r:
return arr[l]
if l > r:
return []
mid = (l+r) >> 1
arr1 = intersect(arr, l, mid)
arr2 = intersect(arr, mid+1, r)
return intersect2(arr1, arr2)
return len(intersect(arrs, 0, len(arrs)-1))