[Intersection of Two Arrays]的一些解法也可以拿过来用,只不过存储结果一个用set一个用list而已
解法一:
public class Solution {
public int[] intersect(int[] nums1, int[] nums2) {
LinkedList<Integer> list = new LinkedList<>();
for(int i = 0; i < nums1.length; i++){
list.add(nums1[i]);
}
LinkedList<Integer> temp = new LinkedList<>();
for(int i = 0; i < nums2.length; i++){
if(list.contains(nums2[i])){
temp.add(nums2[i]);
//list.remove(nums2[i]);//因为要保留重复元素,原来nums1对应的list要删除这个元素
list.remove(new Integer(nums2[i]));//这里有个重载,若remove参数是int,代表下标,integer才代表对象
}
}
int[] res = new int[temp.size()];
for(int i = 0; i < res.length; i++){
res[i] = temp.get(i);
}
return res;
}
}
解法二:
public class Solution {
public int[] intersect(int[] nums1, int[] nums2) {
//题目中的follow-up提到考虑内存问题,那么就将nums1的重复元素计数,用Map来存
HashMap<Integer, Integer> map = new HashMap<>();//将nums1存到map中去
for(int i = 0; i < nums1.length; i++){
if(map.containsKey(nums1[i])){
map.put(nums1[i], map.get(nums1[i]) + 1);
//System.out.println("" + nums1[i] + " : " + (map.get(nums1[i])));
}
else{
map.put(nums1[i], 1);
}
}
LinkedList<Integer> temp = new LinkedList<>();
//开始求交集
for(int i = 0; i < nums2.length; i++){
if(map.containsKey(nums2[i])){
temp.add(nums2[i]);
if(map.get(nums2[i]) == 1){//当这个元素在map中只有一个时,移除map中的一个键值对(因为求交集移了一个就只剩0个了)
map.remove(nums2[i]);
}
else{
map.put(nums2[i], map.get(nums2[i]) - 1);//计数减一
}
}
}
int[] res = new int[temp.size()];
for(int i = 0; i < res.length; i++){
res[i] = temp.get(i);
}
return res;
}
}