解题思路:
哈希映射
在这里,我们需要使用 HashMap
来跟踪每个数字出现的次数。
我们先在 HashMap
记录一个数组中的存在的数字和对应出现的次数。然后,我们遍历第二个数组,检查数字在 HashMap
中是否存在,如果存在且计数为正,则将该数字添加到答案并减少 HashMap
中的计数。
检查数组的大小并对较小的数组进行哈希映射是一个小细节,当其中一个数组较大时,会减少内存的使用。
算法:
- 如果
nums1
元素个数大于nums2
,则交换数组元素。 - 对于
nums1
的每个元素,添加到HashMap m
中,如果元素已经存在则增加对应的计数。 - 初始化
k = 0
,记录当前交集元素个数。 - 遍历数组
nums2
:- 检查元素在
m
是否存在,若存在且计数为正:- 将元素拷贝到
nums1[k]
,且k++
。 - 减少
m
中对应元素的计数。
- 将元素拷贝到
- 检查元素在
- 返回
nums1
前k
个元素。
源代码如下:
public int[] intersect(int[] nums1, int[] nums2) {
if (nums1.length > nums2.length) {
return intersect(nums2, nums1);
}
HashMap<Integer, Integer> m = new HashMap<>();
for (int n : nums1) {
m.put(n, m.getOrDefault(n, 0) + 1);
}
int k = 0;
for (int n : nums2) {
int cnt = m.getOrDefault(n, 0);
if (cnt > 0) {
nums1[k++] = n;
m.put(n, cnt - 1);
}
}
return Arrays.copyOfRange(nums1, 0, k);
}