LeetCode.349 两个数组的交集

336 阅读2分钟

这是我参与8月更文挑战的第23天,活动详情查看:8月更文挑战

题目描述:

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

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

示例 1:

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

示例 2:

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

说明:

  • 输出结果中的每个元素一定是唯一的。
  • 我们可以不考虑输出结果的顺序。

思路分析

哈希表

这是最简单的解法了,利用HashSet的值唯一的特性,我们可以遍历第一个数组,存到一个HashSet中,然后遍历第二个数组,与第一个对比,很容易就能求得交集。

AC代码

class Solution {
    fun intersection(nums1: IntArray, nums2: IntArray): IntArray {
        if(nums1.isEmpty() || nums2.isEmpty()){
            return IntArray(0)
        }
        var tempSet = hashSetOf<Int>()
        var resultSet = hashSetOf<Int>()
        for(num1 in nums1){
            tempSet.add(num1)
        }
        for (num2 in nums2){
            if(tempSet.contains(num2)){
                resultSet.add(num2)
            }
        }
        var resultIntArray = IntArray(resultSet.size)
        var index = 0
        for(resultNum in resultSet){
            resultIntArray[index++] = resultNum
        }
        return resultIntArray
    }
}

Kotlin Collections扩展方法之intersect

既然我们用Kotlin解题,众所周知,Kotlin有很多好用实在的语法糖,intersect这个就正好是求交集的。

intersect(…) : 返回一个集合,其中包含此集合和指定集合所包含的所有元素,交集

这个也很简单。

class Solution {
    fun intersection(nums1: IntArray, nums2: IntArray): IntArray {
        if(nums1.isEmpty() || nums2.isEmpty()){
            return IntArray(0)
        }
        return nums1.intersect(nums2.asList()).toIntArray()
    }
}

排序 + 双指针

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

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

这里要注意,有可能相等的情况下之前就已经有过了,这个我们可以用变量记录,也可以利用HashSet过滤都行。

class Solution {
    fun intersection(nums1: IntArray, nums2: IntArray): IntArray {
        if(nums1.isEmpty() || nums2.isEmpty()){
            return IntArray(0)
        }
        var i = 0
        var j = 0
        var index = 0
        var resultSet = hashSetOf<Int>()
        
        nums1.sort()
        nums2.sort()
        
        while (i < nums1.size && j < nums2.size){
            if(nums1[i] == nums2[j]){ 
                resultSet.add(nums1[i])
                i++
                j++
            }else if(nums1[i] < nums2[j]){
                i++
            }else if(nums1[i] > nums2[j]){
                j++
            }
        }
        var resultArray = IntArray(resultSet.size)
        for (resultNum in resultSet){
            resultArray[index++] = resultNum
        }
        return resultArray
    }
}

总结

简单的数组题,常规的哈希表啊,双指针等解法,没有难度。

就是有些api的执行时间有点超纲。

参考

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

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