Given two integer arrays nums1
and nums2
, return an array of their intersection. Each element in the result must be unique and you may return the result in any order.
Example 1:
Input: nums1 = [1,2,2,1], nums2 = [2,2] Output: [2]
Example 2:
Input: nums1 = [4,9,5], nums2 = [9,4,9,8,4] Output: [9,4] Explanation: [4,9] is also accepted.
Constraints:
1 <= nums1.length, nums2.length <= 1000
0 <= nums1[i], nums2[i] <= 1000
就,没什么特殊的技巧,不用built in的set intersection就硬写一个呗。java没有直接从数组到set的互相转换(or LC的编译器不支持)搞得有点烦。就是做intersect的时候遍历小的,在大的里找小的会更省时间。
Runtime: 6 ms, faster than 52.67% of Java online submissions for Intersection of Two Arrays.
Memory Usage: 44.1 MB, less than 36.58% of Java online submissions for Intersection of Two Arrays.
class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
Set<Integer> set1 = new HashSet<>();
for (int num : nums1) {
set1.add(num);
}
Set<Integer> set2 = new HashSet<>();
for (int num : nums2) {
set2.add(num);
}
List<Integer> resultList = set1.size() < set2.size() ? intersect(set1, set2) : intersect(set2, set1);
int result[] = new int[resultList.size()];
for (int i = 0; i < resultList.size(); i++) {
result[i] = resultList.get(i);
}
return result;
}
private List<Integer> intersect(Set<Integer> small, Set<Integer> large) {
List<Integer> result = new ArrayList<>();
for (int i : small) {
if (large.contains(i)) {
result.add(i);
}
}
return result;
}
}
然后看了一下讨论,有人说这题被标上了binary search。如果给定的数组是sorted的话,可以用二分查找。尤其是当n << m时,O(nlogm)可能比O(n+m)还快,嗯,着实是没想到。