Friday, August 10, 2018

349, 350 Intersection of Two Arrays, Intersection of Two Arrays II

349Intersection of Two Arrays
Given two arrays, write a function to compute their intersection.
Example 1:
Input: nums1 = [1,2,2,1], nums2 = [2,2]
Output: [2]
Example 2:
Input: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
Output: [9,4]
Note:
  • Each element in the result must be unique.
  • The result can be in any order.
------------------------
class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        Set<Integer> set = getSet(nums1);   
        Set<Integer> rt = new HashSet<>();
        
        for (int num : nums2) {
            if (set.contains(num)) {
                rt.add(num);
            }
        }
        
        int[] rtArr = new int[rt.size()];
        int i = 0;
        for (int num : rt) {
            rtArr[i] = num;
            i++;
        }
        
        return rtArr;
    }
    
    private Set<Integer> getSet(int[] nums) {
        Set<Integer> set = new HashSet<>();
        
        for (int num : nums) {
            set.add(num);
        }
        
        return set;
    }
}

350Intersection of Two Arrays II
Given two arrays, write a function to compute their intersection.
Example 1:
Input: nums1 = [1,2,2,1], nums2 = [2,2]
Output: [2,2]
Example 2:
Input: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
Output: [4,9]
Note:
  • Each element in the result should appear as many times as it shows in both arrays.
  • The result can be in any order.
Follow up:
  • What if the given array is already sorted? How would you optimize your algorithm?
  • What if nums1's size is small compared to nums2's size? Which algorithm is better?
  • What if elements of nums2 are stored on disk, and the memory is limited such that you cannot load all elements into the memory at once?
--------------------------------
Same idea, but with Map
class Solution {
    public int[] intersect(int[] nums1, int[] nums2) {
        Map<Integer, Integer> map = getMap(nums1);
        
        List<Integer> rt = new ArrayList<>();
        
        for (int num : nums2) {
            if (map.containsKey(num) && map.get(num) > 0) {
                rt.add(num);
                map.put(num, map.get(num) - 1);
            }
        }
        
        int[] rt_arr = new int[rt.size()];
        for (int i = 0; i < rt.size(); i++) {
            rt_arr[i] = rt.get(i);
        }
        
        return rt_arr;
    }
    
    private Map<Integer, Integer> getMap(int[] nums1) {
        Map<Integer, Integer> map = new HashMap<>();
        for (int num : nums1) {
            map.put(num, map.getOrDefault(num, 0) + 1);
        }
        
        return map;
    }
}

No comments:

Post a Comment