@Leetcode350
给定两个数组,编写一个函数来计算它们的交集。
示例 :
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2,2]
思路1:
两个数组都排序,两个数组分别有a、b指针从头指向尾,如果有相同的就添加到结果集并同时向前移一位,如果a指向到较大则b指针前移,否则a指针前移。
class Solution {
public int[] intersect(int[] nums1, int[] nums2) {
int a=0,b=0;
List<Integer> res=new ArrayList<>();
Arrays.sort(nums1);
Arrays.sort(nums2);
while(a<nums1.length&&b<nums2.length){
if(nums1[a]==nums2[b]){
res.add(nums1[a]);
a++;
b++;
}else if(nums1[a]<nums2[b]){
a++;
}else{
b++;
}
}
int[] num=new int[res.size()];
for(int x=0;x<res.size();x++){
num[x]=res.get(x);
}
return num;
}
}
思路2:
把nums1的数放到hashmap中,遍历nums2的时候看如果存在于map则添加到结果集。
class Solution {
public int[] intersect(int[] nums1, int[] nums2) {
//用较小的数组构建哈希表
if(nums1.length>nums2.length) return intersect(nums2,nums1);
Map<Integer,Integer> map=new HashMap<>();
for(int i=0;i<nums1.length;i++){
if(!map.containsKey(nums1[i])){
map.put(nums1[i],1);
}else{
int value=map.get(nums1[i]);
map.put(nums1[i],value+1);
}
}
List<Integer> list=new ArrayList<>();
for(int i=0;i<nums2.length;i++){
if(map.containsKey(nums2[i])){
list.add(nums2[i]);
int value=map.get(nums2[i]);
if(value==1){
map.remove(nums2[i]);
}else{
map.put(nums2[i],value-1);
}
}
}
int[] num=new int[list.size()];
for(int x=0;x<list.size();x++){
num[x]=list.get(x);
}
Arrays.sort(num);
return num;
}
}
map遍历:
Iterator ite=map.entrySet().iterator();
while(ite.hasNext()){
Map.Entry entry=(Map.Entry)ite.next();
Integer key=(Integer)entry.getKey();
Integer val=(Integer)entry.getValue();
}