LeetCode.350 两个数组的交集 II
题目描述:
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()
}
}
总结
参考
转载自:https://juejin.cn/post/6999989059669983263