原题
给定两个数组,写一个方法来计算它们的交集。
例如:
给定 nums1 = [1, 2, 2, 1]
, nums2 = [2, 2]
, 返回 [2, 2]
.
注意:
- 输出结果中每个元素出现的次数,应与元素在两个数组中出现的次数一致。
- 我们可以不考虑输出结果的顺序。
跟进:
- 如果给定的数组已经排好序呢?你将如何优化你的算法?
- 如果 nums1 的大小比 nums2 小很多,哪种方法更优?
- 如果nums2的元素存储在磁盘上,内存是有限的,你不能一次加载所有的元素到内存中,你该怎么办
个人编程水平不高,没有做跟进的题目。
代码如下:
public int[] intersect(int[] nums1, int[] nums2) {
/*
思路使用两个HashMap来辅助,将nums1中的元素与nums2中的元素比较,相等的话分别将数组的索引和对应的值添加到hs3和hs4中,
因为要避免重复,需要在if()里面判断这两HashMap中是否已存有这两数组的键值
*/
HashMap<Integer,Integer> hs3 = new HashMap<Integer,Integer>();
HashMap<Integer,Integer> hs4 = new HashMap<Integer,Integer>();
for(int i = 0; i < nums1.length; i++) {
for(int j = 0; j < nums2.length; j++) {
if(nums1[i] == nums2[j] && !hs3.containsKey(i) && !hs4.containsKey(j)) {
hs3.put(i, nums1[i]);
hs4.put(j, nums2[j]);
}
}
}
ArrayList<Integer> al = new ArrayList<Integer>(hs3.values());
int[] ts = new int[al.size()];
for(int i = 0; i < al.size(); i++) {
ts[i] = al.get(i);
}
return ts;
}
提供一种解题思路,也方便日后回顾和改进。