博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(python版) Leetcode-350.两个数组的交集 II
阅读量:4091 次
发布时间:2019-05-25

本文共 3013 字,大约阅读时间需要 10 分钟。

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 Counterdef 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]# 测试数据 2nums1 = [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 defaultdictdef 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(
, {
4: 1, 9: 1, 5: 1})defaultdict(
, {
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)
in
()----> 1 sum([1,2],[3])TypeError: can only concatenate list (not "int") to listIn [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]: dOut[3]: [1, 2, 4, 4]
你可能感兴趣的文章
【Unity】Destroy和DestroyImmediate的区别
查看>>
【Lua】Mac系统下配置SublimeText的Lua编译环境
查看>>
【C#】利用Conditional属性完成编译忽略
查看>>
【Unity】微信登录后将头像存为bytes,将bytes读取成sprite图片
查看>>
【Unity】使用GPS定位经纬度
查看>>
【UGUI/NGUI】一键换Text/Label字体
查看>>
【C#】身份证本地验证
查看>>
【Unity】坑爹的Bug
查看>>
【算法】求数组中某两个数的和为目标值
查看>>
如何高效学习动态规划?
查看>>
动态规划法(六)鸡蛋掉落问题(一)
查看>>
LeetCode 887.鸡蛋掉落(C++)
查看>>
Dijkstra‘s algorithm (C++)
查看>>
奇异值分解(SVD)的原理详解及推导
查看>>
算法数据结构 思维导图学习系列(1)- 数据结构 8种数据结构 数组(Array)链表(Linked List)队列(Queue)栈(Stack)树(Tree)散列表(Hash)堆(Heap)图
查看>>
求LCA最近公共祖先的离线Tarjan算法_C++
查看>>
Leetcode 834. 树中距离之和 C++
查看>>
【机器学习】机器学习系统SysML 阅读表
查看>>
最小费用最大流 修改的dijkstra + Ford-Fulksonff算法
查看>>
最小费用流 Bellman-Ford与Dijkstra 模板
查看>>