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

150 阅读2分钟

一、题目

给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。

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

二、思考

排序 + 双指针

  • 根据题意,当前数组不需要去重,如果两个数组有相同的值,都可以添加在新数组里
  • 首先通过sort为nums1,nums2排序
  • 其次:定义新的数组,定义nums1和nums2的长度,定义两个列表的指针firstIndex, secondIndex
  • 判断条件依然是当firstIndex 小于 len1 和 secondIndex 小于 len2
  • 这里判断三种情况
  • 第一种是相等的情况,如果相等,则添加进数组,同时双指针都相加1
  • 第二种是nums1[firstIndex] 小于 nums2[secondIndex]的情况,说明当前nums1的值小,则可以继续下一个值firstIndex加1
  • 第三种是nums1[firstIndex] 大于 nums2[secondIndex]的情况,说明当前nums1的值达,则可以secondIndex加1
  • 最后返回新的list

三、代码

排序 + 双指针

class Solution:
    def intersect(self, nums1: List[int], nums2: List[int]) -> List[int]:
        """
        根据题意,当前数组不需要去重,如果两个数组有相同的值,都可以添加在新数组里
        首先通过sort为nums1,nums2排序
        其次:定义新的数组,定义nums1和nums2的长度,定义两个列表的指针firstIndex, secondIndex
        判断条件依然是当firstIndex 小于 len1 和 secondIndex 小于 len2
        这里判断三种情况
        第一种是相等的情况,如果相等,则添加进数组,同时双指针都相加1
        第二种是nums1[firstIndex] 小于 nums2[secondIndex]的情况,说明当前nums1的值小,则可以继续下一个值firstIndex加1
        第三种是nums1[firstIndex] 大于 nums2[secondIndex]的情况,说明当前nums1的值达,则可以secondIndex加1
        最后返回新的list
        :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]:
                list1.append(nums1[firstIndex])
                firstIndex += 1
                secondIndex += 1
            elif nums1[firstIndex] < nums2[secondIndex]:
                firstIndex += 1
            else:
                secondIndex += 1
        return list1

Solution().intersect(nums1, nums2)

四、测试结果

排序 + 双指针

image.png