publicclassIntersectionofTwoArraysII{ /** * 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? */ // sort version publicint[] intersect(int[] nums1, int[] nums2) { Arrays.sort(nums1); Arrays.sort(nums2); int i=0; int j=0; LinkedList<Integer> l = new LinkedList<>(); while(i<nums1.length && j<nums2.length){ if (nums1[i] == nums2[j]){ l.add(nums1[i]); while(i+1<nums1.length && nums1[i+1] == nums2[i]) i++; while(j+1<nums2.length && nums2[j+1] == nums2[j]) j++; } elseif (nums1[i] < nums2[j]){ i++; } else j++; } int[] res = newint[l.size()]; for (int k=0; k<l.size(); k++){ res[k] = l.get(k); } return res; }
// there is a non-sort version, using a publicint[] intesectII(int[] nums1, int[] nums2){ LinkedList<Integer> dic = new LinkedList<>(); LinkedList<Integer> res = new LinkedList<>(); for (int i=0; i<nums1.length; i++){ dic.add(nums1[i]); } for (int i=0; i<nums2.length; i++){ boolean success = dic.remove(new Integer(nums2[i])); if (!success){ res.add(nums2[i]); } }
int[] r = newint[res.size()]; for (int i=0; i<res.size(); i++){ r[i] = res.get(i); } return r; }