leetcode Task01.哈希表 0217. 存在重复元素 0219.存在重复元素II 0349. 两个数组的交集 350. 两个数组的交集 II


一、哈希表基础知识

学习链接
写了一遍没保存…

二、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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值