题意:
其实对于不重复,可以用set
给两个数组,计算它们的交集,交集中元素都只出现一次。
初步分析:
想了下,还是得两重循环,用map,先遍历一个,将元素装进map(只装一次)
然后再遍历另一个,如果map有key,说明重复,也即是相交元素,但是这里不能放入数组,因为数组大小不确定,这里只是统计数量(设置value,使不重复放进去)
最后第三步,遍历map,取出特定值的键(即相交元素)。
public class Solution {
public int[] intersection(int[] nums1, int[] nums2) {
HashMap<Integer, Integer> hm = new HashMap<>();
int count = 0;
for(int i=0; i<nums1.length; i++)
{
if(!hm.containsKey(nums1[i]))
hm.put(nums1[i],1);
}
for(int i=0; i<nums2.length; i++)
{
if(hm.containsKey(nums2[i]) && hm.get(nums2[i]) > 0) //第二次检查到相同相交元素将忽略
{
hm.put(nums2[i],hm.get(nums2[i])-1); //设置相交元素value为1
count++;
}
}
// value 0 -> key
int[] ret = new int[count];
int i = 0;
for (Map.Entry<Integer, Integer> entry : hm.entrySet())
{
if(entry.getValue() == 0) //相交元素
{
ret[i] = entry.getKey();
i++;
}
}
return ret;
}
}
其实对于不重复,可以用set
如果Set集合的remove方法包含参数指定的对象,则返回true;否则返回false
所以,参考一种做法:
public int[] intersection(int[] nums1, int[] nums2) {
Set<Integer> tmp = new HashSet<>();
for(int n:nums1) tmp.add(n);
List<Integer> res = new ArrayList<>();
for(int n:nums2)
if(tmp.remove(n)) //如果包含,说明是相交元素
res.add(n);
int[] rr = new int[res.size()];
for(int i=0;i<res.size();i++)
rr[i] = res.get(i);
return rr;
}