Given two arrays, write a function to compute their intersection.
Input: nums1 = [1,2,2,1], nums2 = [2,2]
Output: [2]
Input: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
Output: [9,4]
// Hashset
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) { // time: O(m + n); space: O(min(m, n))
unordered_set<int> st(nums1.begin(), nums1.end()), res;
for (int num : nums2) {
if (st.count(num)) res.insert(num);
}
return vector<int> (res.begin(), res.end());
}
// STL sorting
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) { // time: O(mlogm+nlogn); space: O(min(m, n))
vector<int> res;
sort(nums1.begin(), nums1.end());
sort(nums2.begin(), nums2.end());
int i = 0, j = 0;
while (i < nums1.size() && j < nums2.size()) {
if (nums1[i] < nums2[j]) ++i;
else if (nums1[i] > nums2[j]) ++j;
else {
if (res.empty() || res.back() != nums1[i])
res.push_back(nums1[i]);
++i, ++j;
}
}
return res;
}
// Binary Search
bool binarySearch(vector<int>& nums, int target) {
int left = 0, right = nums.size();
while (left < right) {
int mid = left + (right - left) / 2;
if (nums[mid] == target) return true;
else if (nums[mid] < target) left = mid + 1;
else right = mid;
}
return false;
}
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) { // time: O(nlogn + mlogn); space: O(min(m, n))
unordered_set<int> res;
sort(nums2.begin(), nums2.end());
for (int num : nums1) {
if (binarySearch(nums2, num))
res.insert(num);
}
return vector<int> (res.begin(), res.end());
}