[leetcode]两个数组的交集II
个人解法
class Solution {
public int[] intersect(int[] nums1, int[] nums2) {
HashMap<Integer,Integer> map=new HashMap<Integer,Integer>();
List<Integer> list=new ArrayList<Integer>();
int []bignums=nums1.length>nums2.length?nums1:nums2;
int []smnums=nums1.length>nums2.length?nums2:nums1;
for(int i=0;i<bignums.length;i++){
if(map.containsKey(bignums[i])){
int count=map.get(bignums[i])+1;
map.put(bignums[i],count);
}
else map.put(bignums[i],1);
}
for(int i=0;i<smnums.length;i++){
if(map.containsKey(smnums[i])){
list.add(smnums[i]);
int value=map.get(smnums[i])-1;
map.put(smnums[i],value);
if(value<1){
map.remove(smnums[i]);
}
continue;
}
else map.remove(smnums[i]);
}
int [] nums=new int[list.size()];
for(int i=0;i<list.size();i++){
nums[i]=list.get(i);
}
return nums;
}
}
别的解法
先将两个数组进行排序,然后使用两个指针分别指向第一个数组和第二个数组,因为数组是排好序的,所以各个数组中的数是连续增长的,当数组一和数组二中的数不相等时,由小的数所在的数组的指针进行递增。如果两个数相等,那么就取这个数,同时将两个指针都增加。最后返回数组。
class Solution {
public int[] intersect(int[] nums1, int[] nums2) {
int len1 = nums1.length;
int len2 = nums2.length;
Arrays.sort(nums1);
Arrays.sort(nums2);
int min = len1 > len2 ? len2 : len1;
int[] res = new int[min];
int count = 0;
for(int i = 0,j = 0; i<len1&&j<len2; ){
if(nums1[i] < nums2[j]){
i++;
continue;
}else if(nums1[i] > nums2[j]){
j++;
continue;
}else if(nums1[i] == nums2[j])
res[count++] = nums1[i];
i++;
j++;
}
return Arrays.copyOf(res, count);
}
}