返回

数据结构的妙用:巧解 LeetCode 350 题,轻松找出两个数组的交集 II

后端

题目背景

给你两个整数数组 nums1nums2 ,请你以数组形式返回两个数组的交集。交集元素不重复出现,也就是两个数组中共同出现过的元素。

示例 1:

输入:nums1 = [1, 2, 2, 1], nums2 = [2, 2]
输出:[2, 2]

示例 2:

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

解题思路

解决 LeetCode 350 题的关键在于找出两种数组的交集元素,也就是同时出现在两个数组中的元素。为了实现这一点,我们可以利用数据结构和算法。

哈希表法

哈希表是一种快速查找数据的结构,它将每个元素映射到一个唯一的位置,从而可以在恒定时间内查找元素。使用哈希表来解决这道题,我们可以先将第一个数组 nums1 的元素插入哈希表中,然后遍历第二个数组 nums2,并检查每个元素是否在哈希表中。如果在,则说明该元素是两个数组的交集元素,将其添加到结果数组中。

Python 代码:

def intersect(nums1, nums2):
    """
    :type nums1: List[int]
    :type nums2: List[int]
    :rtype: List[int]
    """
    # 创建哈希表
    hashtable = {}
    # 将第一个数组中的元素插入哈希表
    for num in nums1:
        if num not in hashtable:
            hashtable[num] = 0
        hashtable[num] += 1
    # 创建结果数组
    result = []
    # 遍历第二个数组
    for num in nums2:
        # 如果元素在哈希表中,则说明是交集元素
        if num in hashtable and hashtable[num] > 0:
            # 将交集元素添加到结果数组中
            result.append(num)
            # 减少哈希表中该元素的计数
            hashtable[num] -= 1
    # 返回结果数组
    return result

双指针法

双指针法是一种高效的算法,它使用两个指针来遍历两个数组。在这道题中,我们可以使用双指针法来比较两个数组的元素,并将交集元素添加到结果数组中。

Python 代码:

def intersect(nums1, nums2):
    """
    :type nums1: List[int]
    :type nums2: List[int]
    :rtype: List[int]
    """
    # 排序两个数组
    nums1.sort()
    nums2.sort()
    # 创建两个指针
    i = 0
    j = 0
    # 创建结果数组
    result = []
    # 遍历两个数组
    while i < len(nums1) and j < len(nums2):
        # 如果两个元素相等,则说明是交集元素
        if nums1[i] == nums2[j]:
            # 将交集元素添加到结果数组中
            result.append(nums1[i])
            # 移动两个指针
            i += 1
            j += 1
        # 如果第一个数组的元素小于第二个数组的元素,则移动第一个指针
        elif nums1[i] < nums2[j]:
            i += 1
        # 如果第一个数组的元素大于第二个数组的元素,则移动第二个指针
        else:
            j += 1
    # 返回结果数组
    return result

总结

LeetCode 350 题《两个数组的交集 II》是一道经典的算法题,旨在考察你对数据结构和算法的理解。通过哈希表法和双指针法,我们可以高效地找到两个数组的交集元素。无论你选择哪种方法,重要的是要理解算法背后的原理,并能够将其应用到其他类似的问题中。