likes
comments
collection
share

LeetCode.350 两个数组的交集 II

作者站长头像
站长
· 阅读数 35

题目描述:

350. 两个数组的交集 II - 力扣(LeetCode) (leetcode-cn.com)

给定两个数组,编写一个函数来计算它们的交集。

示例 1:

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

示例 2:

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

说明:

  • 输出结果中每个元素出现的次数,应与元素在两个数组中出现次数的最小值一致。
  • 我们可以不考虑输出结果的顺序。

进阶:

  • 如果给定的数组已经排好序呢?你将如何优化你的算法?
  • 如果 nums1 的大小比 nums2 小很多,哪种方法更优?
  • 如果 nums2 的元素存储在磁盘上,内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?

思路分析

哈希表

所以我们就需要额外记录每个数字出现的次数了。

首先遍历nums1,统计其中各个元素出现的频率counts

再遍历nums2,如果元素在哈希表中存在,则将该元素添加到答案,并且哈希表中该元素的counts - 1。

AC代码

class Solution {
    fun intersect(nums1: IntArray, nums2: IntArray): IntArray {
        var counts=HashMap<Int,Int>()
        nums1.forEach{
            counts.put(it,(counts[it]?:0)+1)
        }
        var ans=ArrayList<Int>(counts.size)
        nums2.forEach{
            if(counts[it]?:0 >0){
                ans.add(it)
                counts.put(it,(counts[it]?:0) -1)
            }
        }
        return ans.toIntArray()
    }
}

排序 + 双指针

当我们对两个数字进行排序之后,就可以定义2个指针来遍历2个数组。

如果相等,就说明该数是交集之一,如果两个数字不相等,则将指向较小数字的指针右移一位。

class Solution {
    fun intersect(nums1: IntArray, nums2: IntArray): IntArray {
        if(nums1.isEmpty() || nums2.isEmpty()){
            return IntArray(0)
        }
        var i = 0
        var j = 0
        var index = 0
        
        var resultArray = arrayListOf<Int>()

        nums1.sort()
        nums2.sort()
        
        while (i < nums1.size && j < nums2.size){
            if(nums1[i] == nums2[j]){ 
                resultArray.add(nums1[i])
                i++
                j++
                index++
            }else if(nums1[i] < nums2[j]){
                i++
            }else if(nums1[i] > nums2[j]){
                j++
            }
        }
       
        return resultArray.toIntArray()
    }
}

总结

参考

两个数组的交集 II - 两个数组的交集 II - 力扣(LeetCode) (leetcode-cn.com)

转载自:https://juejin.cn/post/6999989059669983263
评论
请登录