LeetCode 349:两个数组的交集

简介: LeetCode 349:两个数组的交集

LeetCode 349:两个数组的交集

题意

给定两个数组,计算它们的交集。

示例

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

输出:[9, 4]

提示

输出结果中的每个元素一定是唯一的。 我们可以不考虑输出结果的顺序。

题目解析

求两个数组的交集,直白点儿就是【nums2 的元素是否在 nums1 中】。

第一种解法

这道题字符串 num1 和 num2 仅包含1000以内,数字就固定的 1000个。

(不要我问我为什么1000以内,因为你has设到100以内报错~)

这种定长的范围且和字符次数相关,用哈希妥妥的没问题。

第一种解法  使用的哈希函数 f(key) = key - 0 。 (这道题思路沿用了242有效字母的异位词~) 哈希函数找好,下面的就很简单:

  1. 遍历字符串 num1,哈希表hash1对应的字符值加。
  2. 遍历字符串 num2,哈希表hash2对应的字符值加。
  3. 判断哈希表hash1不为0,并且hash2也不为0,则把重复的数字输送到result序列

代码实现

class Solution:
    def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
        hash1=[0]*1000
        for i in range(len(nums1)):
            hash1[nums1[i]-0] +=1
        hash2=[0]*1000
        for i in range(len(nums2)):
            hash2[nums2[i]-0] +=1
        result=[]
        for i in range(1000):
            if hash1[i] != 0:
                if hash2[i] != 0:
                    result.append(i)
        return result
复制代码

网络异常,图片无法展示
|

第二种解法

这道题同样也没限制数值的大小,所以就不能用数组来做哈希表。

碰到这种对目前来说是未知数值大小的情况,我们可以使用集合 set 来解决。

代码实现

class Solution:
    def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
        # 有一个数组为空,则交集为空
        if not nums1 or not nums2:
            return []
        # 初始化哈希表
        hash = {}
        # 初始化结果列表,存放最后结果
        res = []
        # 哈希表 key 为 nums1 数组中的数,value 为值
        for i in nums1:
            if not hash.get(i):
                hash[i] = 1
        # 遍历 nums,如果 nums2 数组中的数出现在哈希表中,对应数放入结果列表,对应 value 值置-为0
        for j in nums2:
            if hash.get(j):
                res.append(j)
                hash[j] = 0
        return res



目录
相关文章
|
6天前
【Leetcode】两数之和,给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
【Leetcode】两数之和,给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
|
6天前
|
算法
leetcode代码记录(寻找两个正序数组的中位数
leetcode代码记录(寻找两个正序数组的中位数
13 2
|
6天前
|
索引
leetcode代码记录(最长重复子数组
leetcode代码记录(最长重复子数组
13 0
|
6天前
leetcode代码记录(两个数组的交集
leetcode代码记录(两个数组的交集
9 1
|
6天前
leetcode代码记录(最大子数组和
leetcode代码记录(最大子数组和
12 2
|
6天前
|
存储 算法
Leetcode 30天高效刷数据结构和算法 Day1 两数之和 —— 无序数组
给定一个无序整数数组和目标值,找出数组中和为目标值的两个数的下标。要求不重复且可按任意顺序返回。示例:输入nums = [2,7,11,15], target = 9,输出[0,1]。暴力解法时间复杂度O(n²),优化解法利用哈希表实现,时间复杂度O(n)。
22 0
|
6天前
|
索引
Leetcode 给定一个数组,给定一个数字。返回数组中可以相加得到指定数字的两个索引
Leetcode 给定一个数组,给定一个数字。返回数组中可以相加得到指定数字的两个索引
|
6天前
【力扣】238. 除自身以外数组的乘积
【力扣】238. 除自身以外数组的乘积
|
6天前
|
C++
【力扣】2562. 找出数组的串联值
【力扣】2562. 找出数组的串联值
|
6天前
|
算法 C++ 索引
【力扣经典面试题】238. 除自身以外数组的乘积
【力扣经典面试题】238. 除自身以外数组的乘积