欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

求两个集合的交集

发布时间:2023/12/13 53 豆豆
生活随笔 收集整理的这篇文章主要介绍了 求两个集合的交集 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

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; }

总结

以上是生活随笔为你收集整理的求两个集合的交集的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。