一、哈希表基础知识
学习链接
写了一遍没保存…
二、0217. 存在重复元素
题目:
给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 ,返回 true ;如果数组中每个元素互不相同,返回 false 。
示例:
输入:nums = [1,2,3,1]
输出:true
思路1:
直接转换成集合消除重复元素,比较前后的数组中元素数量。
class Solution:
def containsDuplicate(self, nums: List[int]) -> bool:
nums1 = set(nums)
return len(nums1) != len(nums)
思路2:
使用哈希表储存元素,当发生哈希冲突时,证明存在重复元素。
class Solution:
def containsDuplicate(self, nums: List[int]) -> bool:
hash_nums = dict()
for num in nums:
if num in hash_nums:
return True
else:
hash_nums[num] = num
return False
三、0219.存在重复元素II
题目:
给你一个整数数组 nums 和一个整数 k ,判断数组中是否存在两个 不同的索引 i 和 j ,满足 nums[i] == nums[j] 且 abs(i - j) <= k 。如果存在,返回 true ;否则,返回 false 。
示例:
输入:nums = [1,2,3,1], k = 3
输出:true
思路:
依旧使用哈希表,但是只维护一个长度为k的哈希表,当在长度为k的哈希表发生哈希冲突时,认为满足 nums[i] == nums[j] 且 abs(i - j) <= k
该条件满足。
class Solution:
def containsNearbyDuplicate(self, nums: List[int], k: int) -> bool:
hash_nums = dict()
for i in range(len(nums)):
if nums[i] in hash_nums:
return True
else:
hash_nums[nums[i]] = nums[i]
if len(hash_nums) > k:
hash_nums.pop(nums[i-k])
return False
注意:
python中字典dict和集合set都是无序的,需要制定键值对或者元素才能删除。字典使用del或者pop,set使用remove。
四、0349. 两个数组的交集
题目:
给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
示例:
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]
思路1:
先用集合set去掉重复元素,再将两个集合求个&与运算,得到交集,再转换成list输出。
class Solution:
def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
nums1_set = set(nums1)
nums2_set = set(nums2)
return list(nums1_set & nums2_set)
思路2:
使用哈希表,先将nums1的元素存入哈希表。再将nums2的元素在哈希表中遍历查找,并将已经找到的元素的键值置为0,以免选出重复的元素。
class Solution:
def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
nums_dict = dict()
nums_result = []
for num in nums1:
if num not in nums_dict:
nums_dict[num] = 1
for num in nums2:
if num in nums_dict and nums_dict[num] == 1:
nums_dict[num] = 0
nums_result.append(num)
return nums_result
五、350. 两个数组的交集 II
题目:
给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。
示例:
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2,2]
思路:
与上题的解题思路一致,但需要做点修改。将字典的值记录为该元素出现的次数,并在查找nums2中的元素时,更新元素的次数,从而能在结果中返回重复的元素。
class Solution:
def intersect(self, nums1: List[int], nums2: List[int]) -> List[int]:
nums_dict = dict()
num_result = []
for num in nums1:
if num in nums_dict:
nums_dict[num] += 1
else:
nums_dict[num] = 1
for num in nums2:
if num in nums_dict and nums_dict[num] != 0:
nums_dict[num] -= 1
num_result.append(num)
return num_result