(python版) Leetcode-350.两个数组的交集 II

01 题目

链接:https://leetcode-cn.com/problems/intersection-of-two-arrays-ii
给定两个数组,编写一个函数来计算它们的交集。

示例 1:

输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2,2]

示例 2:

输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[4,9]

02 代码&解析(1行解法-Counter)

from collections import Counter
def intersect(nums1,nums2):
    # print(Counter(nums1),Counter(nums2))
    # print((Counter(nums1) & Counter(nums2)))
    # print(*(Counter(nums1) & Counter(nums2)))   # 序列+*相当于解压
    return [*(Counter(nums1) & Counter(nums2)).elements()]
# 测试数据 1
# nums1 = [1,2,2,1]
# nums2 = [2,2]
# 测试数据 2
nums1 = [4,9,5]
nums2 = [9,4,9,8,4]
print(intersect(nums1,nums2))

输出:

Counter({4: 1, 9: 1, 5: 1}) Counter({9: 2, 4: 2, 8: 1})
Counter({4: 1, 9: 1})
4 9
[4, 9]

解法原链接:https://leetcode-cn.com/problems/intersection-of-two-arrays-ii/solution/1-xing-python-jin-jie-jie-fa-by-qqqun902025048/

1. collection的Counter计数器

python内置函数,快速统计单词在字符串 / 文本中出现的次数
https://blog.csdn.net/eddy_zheng/article/details/47336271
字符串的用法同上
文本单词的统计如下
在这里插入图片描述

2. & 取交集

3. 加* 解压

在这里插入图片描述
(此图来自 https://www.cnblogs.com/linwenbin/p/10362811.html)

4. elements()

在这里插入图片描述

03 代码&解析(hash解法)

利用字典统计nums1和nums2每个元素的数量,然后取得两个字典 相同键的 最小值,返回结果。
细品~~ 两个字典 相同键的 最小值

from collections import defaultdict
def intersect(nums1, nums2):
    dct1 = defaultdict(int)	# 字典dct1 存nums1
    for i in nums1:
        dct1[i] += 1
        
    dct2 = defaultdict(int)	# 字典dct2 存nums2
    for i in nums2:
        dct2[i] += 1
        
    print(dct1,'\n',dct2,'\n',set(dct1)&set(dct2))
    dct3 = {i: min(dct1[i], dct2[i]) for i in set(dct1)&set(dct2)}
    print(dct3)
    
    return sum([[key]*val for key, val in dct3.items()], [])
    
# nums1 = [1,2,2,1]
# nums2 = [2,2]
nums1 = [4,9,5]
nums2 = [9,4,9,8,4]
print(intersect(nums1,nums2))

输出

defaultdict(<class 'int'>, {4: 1, 9: 1, 5: 1})
defaultdict(<class 'int'>, {9: 2, 4: 2, 8: 1})
{9, 4}
{9: 1, 4: 1}
[9, 4]

解法原链接:https://leetcode-cn.com/problems/intersection-of-two-arrays-ii/solution/python3-ha-xi-biao-by-ting-ting-28-3/

1. defaultdict与dict实例化字典类型的区别

使用defaultdict任何未定义的key都会默认返回一个根据method_factory参数不同的默认值, 而相同情况下dict()会返回KeyError.

2. dct3 = {i: min(dct1[i], dct2[i]) for i in 交集}

取交集的9,dct1[9]=1,dct2[9]=2,min(dct1[i], dct2[i]) 为1,则dct3中存{9:1}
取交集的4,dct1[4]=1,dct2[4]=2,min(dct1[i], dct2[i]) 为1,则dct3中存{9:1,4: 1}

3. [key]*val for key, val in dct3.items()

val为几,key就出现几次
如 9 1 ==> [9]
如 4 1 ==> [4]
如 7 3 ==> [7,7,7]

4. 汇总在一个[]里 sum([])

一行 [key]*val for key, val in dct3.items() 的结果

[[9], [4]]

sum([[key]*val for key, val in dct3.items()],[]) 的结果

[9, 4]

得加个[ ] ,否则会报错,可能是要将它看成一整个数组才行

In [5]: sum([1,2],[3])
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-5-7b375e43be83> in <module>()
----> 1 sum([1,2],[3])

TypeError: can only concatenate list (not "int") to list

In [6]: sum([[1,2]],[3])
Out[6]: [3, 1, 2]

* 当然不一定用sum,用+号就能把两个数组合并

可以新建个数组存放

list4 = []
for key, val in dct3.items():
	# print(key,val,[key]*val)
	list4 = list4+[key]*val
In [1]: a = [1,2]
In [2]: d = a+[4,4]

In [3]: d
Out[3]: [1, 2, 4, 4]
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值