算法练习第50题-两个数组的交集

207 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第5天,点击查看活动详情

一、题目

给定两个数组 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] 也是可通过的

作者:力扣 (LeetCode) 链接:leetcode.cn/leetbook/re… 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

二、 思路

暴力解法

  • 由题意可知,要找两个list的交集。那么只需要找到最小的list,在最小的list中循环值,在大的list中查,存在的话,就放在一个新的数组中
  • 第一步给数组去重,set
  • 第二步:判断最小的list和最大的list
  • 第三步,嵌套循环,将交集的参数放入新的list中,返回list
  • 优化
  • 嵌套循环使用推导式
  • 最小值与最大值得判断可以通过递归处理

排序双指针

  • 通过排序,将数组变为有序数组,那么两个数组中,交集必然相等,使用双指针处理
  • 因此有三种情况,
  • 第一种是相等的情况,如果相等,且返回的数组list1中没有值,则添加进数组,同时双指针都相加1
  • 第二种是nums1[firstIndex] 小于 nums2[secondIndex]的情况,说明当前nums1的值小,则可以继续下一个值firstIndex加1
  • 第三种是nums1[firstIndex] 大于 nums2[secondIndex]的情况,说明当前nums1的值达,则可以secondIndex加1

三、代码

nums1, nums2= [4,9,5,1], [9,4,9,8,4,1]
class Solution:
    def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
        """
        由题意可知,要找两个list的交集。那么只需要找到最小的list,在最小的list中循环值,在大的list中查,存在的话,就放在一个新的数组中
        第一步给数组去重,set
        第二步:判断最小的list和最大的list
        第三步,嵌套循环,将交集的参数放入新的list中,返回list

        优化
        嵌套循环使用推导式
        最小值与最大值得判断可以通过递归处理
        :param nums1:
        :param nums2:
        :return:
        """
        list1, list2, maxNum, minNum = set(nums1), set(nums2), [], []
        if len(list1)> len(list2):
            maxNum, minNum = list1, list2
        else:
            maxNum, minNum = list2, list1
        # list3 = []
        # for i in minNum:
        #     if i in maxNum:
        #         list3.append(i)
        # return list3

        return [i for i in minNum if i in maxNum]

Solution().intersection(nums1, nums2)

排序双指针

class Solution:
    def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
        """
        通过排序,将数组变为有序数组,那么两个数组中,交集必然相等,使用双指针处理
        因此有三种情况,
        第一种是相等的情况,如果相等,且返回的数组list1中没有值,则添加进数组,同时双指针都相加1
        第二种是nums1[firstIndex] 小于 nums2[secondIndex]的情况,说明当前nums1的值小,则可以继续下一个值firstIndex加1
        第三种是nums1[firstIndex] 大于 nums2[secondIndex]的情况,说明当前nums1的值达,则可以secondIndex加1

        :param nums1:
        :param nums2:
        :return:
        """
        nums1.sort()
        nums2.sort()
        list1, len1, len2, firstIndex, secondIndex = list(), len(nums1), len(nums2), 0, 0
        while firstIndex < len1 and secondIndex < len2:
            if nums1[firstIndex] == nums2[secondIndex]:
                if nums1[firstIndex] not in list1:
                    list1.append(nums1[firstIndex])
                firstIndex += 1
                secondIndex += 1
            elif nums1[firstIndex] < nums2[secondIndex]:
                firstIndex += 1
            else:
                secondIndex += 1
        return list1



Solution().intersection(nums1, nums2)

四、测试结果

暴力解法

image.png

排序双指针

image.png