題目:
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進行二分查找。