https://leetcode.com/problems/intersection-of-two-arrays/description/
Given two arrays, write a function to compute their intersection.
Example:
Given nums1 = [1, 2, 2, 1], nums2 = [2, 2], return [2].
Note:
Each element in the result must be unique.
The result can be in any order.
corner case, ways to initialize array
1: int[] res = new int[x] ;
2: int[] res = new int[]{1,2,3} ;
3: declare but initialize later
int[] res ;
res = new int[3] ;
1 /**
2 * if using binary search:
3 * time: nums1 #: n nums2 #: m
4 * sorting for num2: mlogm
5 * b.s for num1: n*log(m)
6 * total mlogm + n*log(m) ---> nlogn
7 *
8 * space: o(n) for using hashset storing nums1
9 */
10 public int[] intersection_bs(int[] nums1, int[] nums2) {
11 if (nums1 == null || nums1.length == 0 || nums2 == null || nums2.length == 0) {
12 return new int[]{};
13 }
14 Set<Integer> set = new HashSet<>();
15 Arrays.sort(nums2);
16 for (Integer num : nums1) {
17 if (binarySearch(nums2, num)) {
18 set.add(num);
19 }
20 }
21 //convert from set to to array
22 int i = 0;
23 int[] resArray = new int[set.size()];
24 for (Integer num : set) {
25 resArray[i++] = num;
26 }
27 return resArray;
28 }
29
30 private boolean binarySearch(int[] nums2, Integer num) {
31 int left = 0, right = nums2.length - 1;
32 while (left + 1 < right) {
33 int mid = left + (right - left) / 2;
34 if (nums2[mid] == num) {
35 return true;
36 } else if (nums2[mid] < num) {
37 left = mid;
38 } else {
39 right = mid;
40 }
41 }
42 // post processing for the left and right
43 return nums2[left] == num || nums2[right] == num;
44 }
45
46 //use two pointers time: o(n) space: o(n)
47 public int[] intersection_twoPointer(int[] nums1, int[] nums2) {
48 if (nums1 == null || nums1.length == 0 || nums2 == null || nums2.length == 0) {
49 return new int[]{};
50 }
51 Set<Integer> set = new HashSet<>();
52 Arrays.sort(nums1);
53 Arrays.sort(nums2);
54 int i = 0;
55 int j = 0;
56 //here time complexity is: n + m: 取交集,当然要两个都不为空
57 while (i < nums1.length && j < nums2.length) {
58 if (nums1[i] < nums2[j]) {
59 i++;
60 } else if (nums1[i] > nums2[j]) {
61 j++;
62 } else {
63 set.add(nums1[i]);
64 i++;
65 j++;
66 }
67 }
68 //convert from set to to array
69 int i = 0;
70 int[] resArray = new int[set.size()];
71 for (Integer num : set) {
72 resArray[i++] = num;
73 }
74 return resArray;
75 }
76
77 //method 3: time o(n) space: o(n)
78 public int[] intersection_twoSets(int[] nums1, int[] nums2) {
79 if (nums1 == null || nums1.length == 0 || nums2 == null || nums2.length == 0) {
80 return new int[]{};
81 }
82 Set<Integer> set = new HashSet<>();
83 for (Integer num : nums1) {
84 //when you add nums to set, dont need to consider dup. will overwrite
85 set.add(num);
86 }
87 Set<Integer> ret = new HashSet<>();
88 for (Integer num : nums2) {
89 if (set.contains(num)) {
90 ret.add(num);
91 }
92 }
93 int[] resArr = new int[ret.size()];
94 int i = 0;
95 for (Integer num : ret) {
96 resArr[i++] = num;
97 }
98 return resArr;
99 }