题目:
Given two arrays, write a function to compute their intersection.
Example:
Given nums1 = [1, 2, 2, 1]
, nums2 = [2, 2]
, return [2, 2]
.
Note:
- Each element in the result should appear as many times as it shows in both arrays.
- The result can be in any order.
题意:
给两个数组,实现求出两个数组的交集,并返回vector,要求返回的结果中单种元素出现次数应与两个数组中较小保持一致。不要求顺序。
我们可以先判断一下两个数组是否为空集,之后给nums1排序,之后枚举nums2中的元素,假如nums2[i]在nums1中存在,则将此元素加之至返回结果中,并从nums1中删掉此元素。
为了优化时间,将nums1排序后可以使用二分查找方法。时间复杂度 m*log(n)。
代码如下:
class Solution {
public:
int binaryFind(vector<int> nums, int target) {
int l = 0, r = nums.size()-1;
while (l < r) {
int mid = (l + r) / 2;
if (nums[mid] == target)
return mid;
if (nums[mid] > target) {
r = mid - 1;
}
else {
l = mid + 1;
}
}
if (nums[l] == target) return l;
return -1;
}
vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
if (nums1.empty() || nums2.empty()) return {};
vector<int>ans;
sort(nums1.begin(), nums1.end());
for (int i : nums2) {
if (nums1.empty()) break;
int addr = binaryFind(nums1, i);
if (addr != -1) {
ans.push_back(i);
nums1.erase(nums1.begin()+addr);
}
}
return ans;
}
};
对于所提出的问题:
1. 假如所给的都是排好序的,那么可以直接用两个指针,分别从前向后开始枚举,相同则放入,不同则略过。
2. 假如nums1大小小于nums2的话,,,可以枚举nums1,对nums2进行二分查找。