Given two arrays, write a function to compute their intersection.
- Each element in the result must be unique.
- The result can be in any order.
Given nums1 = [1, 2, 2, 1], nums2 = [2, 2], return [2].
没有明确给出。
找相同元素的题目,我的第一个感觉都是用set去解决。对于这道题,先遍历一下nums1并将nums1的元素放入到set中,set保证了元素的唯一性(已存在的元素不会被再次插进去)。然后遍历nums2并判断nums2的元素是否在set中,在就添加该元素到结果数组,并且从set中删除该元素,避免重复添加元素。
这道题目也可以用排序加双指针来解决。
对nums1和nums2进行排序。分别设置i,j指针指向两个数组的首位,判断nums1[i]和nums2[j]的大小关系:
- nums1[i] < nums2[j],增加i
- nums1[i] > nums2[j],增加j
- nums1[i] == nums2[j], 当且仅当结果数组为空或是还没有这个元素,就添加nums1[i]。最后增加i和j。
进行上述过程直到i,j中的一个越过了数组范围。
这道题还有其他解法,比如二分法查找等,但我一开始用set通过了,然后用排序加双指针也过了一遍,其他的没有尝试,下面只给出这两种解法的代码。
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
set<int> nums;
vector<int> intersection;
for (auto n: nums1) {
if (nums.find(n) == nums.end())
nums.insert(n);
}
for (auto n: nums2) {
if (nums.find(n) != nums.end()) {
intersection.push_back(n);
nums.erase(n);
}
}
return intersection;
}
};
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
sort(nums1.begin(), nums1.end());
sort(nums2.begin(), nums2.end());
vector<int> nums;
for (int i = 0, j = 0; i < nums1.size() && j < nums2.size(); ) {
if (nums1[i] < nums2[j]) {
i++;
}
else if (nums1[i] > nums2[j]) {
j++;
}
else {
if (nums.empty() || nums[nums.size() - 1] != nums1[i])
nums.push_back(nums1[i]);
i++;
j++;
}
}
return nums;
}
};
这道题还是比较简单的,解法也不唯一,有时间可以尽量多完成几个不同的算法。
轻松填完一个坑,继续下一个!加油!