LeetCode每日一题,349. Intersection of Two Arrays
先看题目描述
大意就是给定两个数组,让我们求其交集
算法和思路
哈希表+集合
大致想法就是先创建一个哈希表 map 和一个集合 nums,然后遍历 nums1 数组,将其中的每个数字作为 key 加入到 map 中,key 对应的 value 随便取就行,然后遍历 nums2 数组,对于其中的每个数字,判断 map 中是否包含此 key 值,若存在此 key 值,则将该数添加至集合 nums 中,最后将结果中数字依次添加至结果数组中即可
排序+双指针
首先对两个数组进行排序,然后使用两个指针遍历两个数组。可以预见的是加入答案的数组的元素一定是递增的,为了保证加入元素的唯一性,我们需要额外记录变量 pre 表示上一次加入答案数组的元素
初始时,两个指针分别指向两个数组的头部。每次比较两个指针指向的两个数组中的数字,如果两个数字不相等,则将指向较小数字的指针右移一位,如果两个数字相等,且该数字不等于 pre ,将该数字添加到答案并更新 pre 变量,同时将两个指针都右移一位。当至少有一个指针超出数组范围时,遍历结束
算法源码
哈希表+集合
1 | import java.util.*; |
排序+双指针
1 | import java.util.*; |
这里面的 Arrays.copyOfRange() 方法是第一次见到,可以快速复制数组的一部分,感觉还是很方便的
在看题解的评论时还看到了一种解法,虽然运行效率不高,但是使用的几个方法以前没见过,还是可以学习一下的
1 | import java.util.*; |
这里的 retainAll() 方法以前没有见过,作用是可以求两个集合的交集,还有 set1.stream().mapToInt(i->i).toArray() 这种集合转数组的方法也没见过,我是遍历集合来转的数组,但测试了一下发现遍历集合转数组的方式是效率更高的
然后又看见了一个更骚的写法,这代码是真没看懂,但是运行效率太低
1 | import java.util.*; |