letcode原题
排序+双指针
- 如果两个数组是有序的,则可以使用双指针的方法得到两个数组的交集。
- 首先对两个数组进行排序,然后使用两个指针遍历两个数组。
- 初始时,两个指针分别指向两个数组的头部。每次比较两个指针指向的两个数组中的数字,如果两个数字不相等,则将指向较小数字的指针右移一位,如果两个数字相等,将该数字添加到答案,并将两个指针都右移一位。当至少有一个指针超出数组范围时,遍历结束。
std::vector<int>intersect(std::vector<int>&num1,std::vector<int>&num2){std::sort(num1.begin(),num1.end());std::sort(num2.begin(),num2.end());int left = 0;int right = 0;std::vector<int>ans;while (left < num1.size() && right < num2.size()){if (num1[left]==num2[right]){ans.push_back(num1[left]);left++;right++;}if (num1[left]<num2[right]){left++;}if (num1[left]>num2[right]){right++;}}return ans;
}
哈希表
- 推荐使用哈希表的方式
vector<int> intersect(vector<int>& nums1, vector<int>& nums2){if (nums2.size()<nums1.size()){return intersect(nums2,nums1);}std::unordered_map<int,int>map{};for (auto temp : nums1) {++map[temp];}std::vector<int>intersection;for (auto temp:nums2) {if (map.find(temp)!=map.end()){intersection.push_back(temp);map[temp]--;if (map[temp]<=0){map.erase(temp);}}}return intersection;
}