[leetcode]两个数组的交集II

[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);
    }
}