日新计划349. 两个数组的交集

57 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第11天,点击查看活动详情

一、题目描述:

349. 两个数组的交集 - 力扣(LeetCode)

给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。   示例 1:

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

示例 2:

输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]
解释:[4,9] 也是可通过的

  提示:

  • 1 <= nums1.length, nums2.length <= 1000
  • 0 <= nums1[i], nums2[i] <= 1000

二、思路分析:

先对nums1和nums2进行排序,然后在两个数组中分别设置指针i和j。判断nums1[i]和nums2[j]的值得大小:

  1. 相同,则保存到结果数组res,i和j的值都增加(这里的增加还需要考虑跳过相同的值,防止传入相同的值到res)
  2. nums1[i]大,则j的值增加(跳过相同的值)
  3. nums2[j]大,则i的值相加(情况同上)

三、AC 代码:

class Solution(object):
    def intersection(self, nums1, nums2):

        m = len(nums1)
        n = len(nums2)
        i, j = 0, 0              # 设置双指针
        if not nums1 or not nums2:    # 如果有一个数组为空,则放回[]
            return []
        nums1.sort()              #排序
        nums2.sort()
        res = []
        while i < m and j < n:
            if nums1[i] == nums2[j]:      # 相等则保存值
                res.append(nums1[i])
                while i + 1 < m and nums1[i] == nums1[i + 1]:   # 跳过相同的值
                    i += 1
                while j + 1 < n and nums2[j] == nums2[j + 1]:   #  同上
                    j += 1
                i += 1
                j += 1
            elif nums1[i] < nums2[j]:
                while i + 1 < m and nums1[i] == nums1[i + 1]:
                    i += 1
                i += 1
            else:
                while j + 1 < n and nums2[j] == nums2[j + 1]:
                    j += 1
                j += 1
        return res

范文参考

利用两个HashSet来存储元素,然后逐个判断是否有重复元素 - 两个数组的交集 - 力扣(LeetCode)

「代码随想录」349. 两个数组的交集:考察了set在哈希法中的应用(详解) - 两个数组的交集 - 力扣(LeetCode)

349. 两个数组的交集 - 哈希 排序 双指针 二分 - 两个数组的交集 - 力扣(LeetCode)