两个数组的交集 II---简单
Posted manch1n想玩LOL
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了两个数组的交集 II---简单相关的知识,希望对你有一定的参考价值。
题目:
给定两个数组,编写一个函数来计算它们的交集。
示例:
输入: nums1 = [1,2,2,1] nums2 = [2,2]
输出: [2,2]
思路:
比较浅显的O(n^2)的做法就是用一个bool数组保存着nums2的元素是否可以被取。暂时没有什么更简便的想法。
class Solution { public: vector<int> intersect(vector<int>& nums1, vector<int>& nums2) { int length1=nums1.size(); int length2=nums2.size(); vector<bool> if_taken{length2}; vector<int> result; for(int i=0;i<length1;i++) { for(int j=0;j<length2;j++) { if(nums1[i]==nums2[j]) { if(!if_taken[j]) { result.push_back(nums2[j]); if_taken[j]=true; continue; } } } } return result; } };
结果就是数据量大了,内存不够了呢。
让我们来看看更简便的解法吧:
有一种方法是使用哈希表,先保存第一个数组元素出现的次数,再在nums2中遍历,时间复杂度为O(n)。
class Solution { public: vector<int> intersect(vector<int>& nums1, vector<int>& nums2) { if (nums1.empty()) return {}; if (nums2.empty()) return {}; vector<int> result; map<int,int> nums; for (auto i = nums1.cbegin(); i < nums1.cend(); ++i) { ++nums[*i]; } for (int i = 0; i < nums2.size(); ++i) { if (nums[nums2[i]]) { result.push_back(nums2[i]); --nums[nums2[i]] ; } } return result; } };
第二种方法先排序,然后使用双指针,看起来复杂度为O(n^2)呢。不过却是最快的,应该还要更详细的数学分析。可以看到,虽然有两个循环,可是每个数组都只遍历了一次,所以是O(nlogn)+O(n)=O(nlogn)
class Solution { public: vector<int> intersect(vector<int>& nums1, vector<int>& nums2) { vector<int> result; std::sort(nums1.begin(), nums1.end()); std::sort(nums2.begin(), nums2.end()); int index = 0; for (int i = 0; i < nums1.size(); ++i) { for (int j = index; j < nums2.size(); ++j) { if (nums1[i] == nums2[j]) { result.push_back(nums1[i]); index = j + 1; break; } if (nums1[i] < nums2[j]) { break; } } } return result; } };
以上是关于两个数组的交集 II---简单的主要内容,如果未能解决你的问题,请参考以下文章