数组的交集——倒排索引查询,因为不重复,还是可以采用计数的思路做,外部排序,二路归并的做法也不错

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
  • 题目数据每个数组里的元素没有重复
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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

 此外,还可以使用 二路归并的做法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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))

 

 

posted @   bonelee  阅读(147)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
历史上的今天:
2018-01-23 DNS隐蔽通道 是可以通过dig 子域名来追踪其真实IP的
2017-01-23 elasticsearch聚合操作——本质就是针对搜索后的结果使用桶bucket(允许嵌套)进行group by,统计下分组结果,包括min/max/avg
2017-01-23 splunk的统计分析功能——特定字段的统计功能包括取值分布(+topK,min/max/平均值)
2017-01-23 wiretiger引擎支持行、列存储、LSM,mongodb用的哪个?
2017-01-23 LSM树——放弃读能力换取写能力,将多次修改放在内存中形成有序树再统一写入磁盘,查找复杂度O(k*log(n)),结合bloom filter提高查找性能
2017-01-23 LSM树——LSM 将B+树等结构昂贵的随机IO变的更快,而代价就是读操作要处理大量的索引文件(sstable)而不是一个,另外还是一些IO被合并操作消耗。
2017-01-23 赴美生子的一些调研——诚信是拒签之本,中国的月子中心在美是非法的,医疗和教育费用高
点击右上角即可分享
微信分享提示