349 求两个数组的交集
题意:给定两个数组,编写一个函数来计算它们的交集。注意:输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
提示:
1 <= nums1.length, nums2.length <= 1000
0 <= nums1[i], nums2[i] <= 1000
使用数组做哈希题目(或者说这种索引对应元素的),是因为题目都限制了数值的大小。刚好这道题目的提示部分限制了数组长度以及数组中元素的大小,所以可以用数组。思路同上一题。
时间复杂度 O(n) 空间复杂度O(1)
class Solution(object):
def intersection(self, nums1, nums2):
"""
:type nums1: List[int]
:type nums2: List[int]
:rtype: List[int]
"""
# 数组解法
# 为什么可以用数组?因为题目当中限制是数组长度以及数组中元素取值范围
# 1 <= nums1.length, nums2.length <= 1000
# 0 <= nums1[i], nums2[i] <= 1000
temp1_list = [0]*1001
temp2_list = [0]*1001
for i in range(len(nums1)):
temp1_list[nums1[i]] += 1
for i in range(len(nums2)):
temp2_list[nums2[i]] += 1
result = []
for i in range(1001):
if temp1_list[i]*temp2_list[i] != 0:
result.append(i)
return result
如果没有限制数组大小及数组元素大小呢?——>使用字典和集合结合的方法。
class Solution(object):
def intersection(self, nums1, nums2):
"""
:type nums1: List[int]
:type nums2: List[int]
:rtype: List[int]
"""
# 如果没有限制呢? ——> 使用字典和集合
# 定义一个字段 键为数组元素的值 值为元素出现次数
tabel = {}
for i in nums1:
tabel[i] = tabel.get(i, 0) + 1
result = set() # 定义一个集合来存储结果
for i in nums2:
if i in tabel:
result.add(i) # 将该元素添加到集合中
del tabel[i] # 删除该键
return list(result) # 注意最终返回的是列表
时间复杂度:O(n)、空间复杂度:O(1)
一种更简单的方法——>直接使用集合,取交集
class Solution(object):
def intersection(self, nums1, nums2):
"""
:type nums1: List[int]
:type nums2: List[int]
:rtype: List[int]
"""
return list(set(nums1)&set(nums2))