这是我参与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的执行时间有点超纲。