leetcode学习笔记(350. 两个数组的交集)

58 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第4天,点击查看活动详情

本题考察数列相关知识,为简单题350.两个数组的交集

350. 两个数组的交集

题目

给你两个整数数组 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]
提示:
1 <= nums1.length, nums2.length <= 1000
0 <= nums1[i], nums2[i] <= 1000

代码

排序 + 双指针

class Solution:
    def intersect(self, nums1: List[int], nums2: List[int]) -> List[int]:
        nums1.sort()
        nums2.sort()
        result = []
        i = j = 0
        
        while i < len(nums1) and j < len(nums2):
            if nums1[i] < nums2[j]:
                i += 1
            elif nums1[i] > nums2[j]:
                j += 1
            else:
                result.append(nums1[i])
                i += 1
                j += 1
                
        return result

用字典

class Solution:
    def intersect(self, nums1: List[int], nums2: List[int]) -> List[int]:
        amap = {}
        result = []
        
        for i in nums1:
            if i in amap:
                amap[i] += 1
            else:
                amap[i] = 1
        for j in nums2:
            if j in amap:
                val = amap[j]
            else:
                val = 0
            if val > 0:
                result.append(j)
                amap[j] -= 1
                
        return result

解析

有两种方法:
方法一:
1.把两个数组分别排序
2.分别定义一个“指针”指向开头,用while循环(以“指针”小于数组长度为条件),根据“指针”所指的两个数的大小分别移动“指针”,如果两个“指针”指向的数相等则存入result
3.循环结束后,剩下没有遍历的数肯定不可能同时在两个数组里,所以输出result即可

方法二:
1.定义一个字典amap,把nums1数组保存成字典的形式
2.遍历nums2数组里的元素,如果在字典amap里则减去这个元素,并把该元素保存到result里
3.遍历结束后result就是所有重复数字,输出即可

来源:力扣(LeetCode)
链接:leetcode.cn/problems/in…
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。