数组之求两个sorted Array的交集

来源:互联网 发布:移动2g网络可以上网吗 编辑:程序博客网 时间:2024/06/05 16:04
//计算两个有序数组的交集,数组的相对大小一般会影响算法的效率,所以需要根据两个数组的相对大小来确定采用的方法;//假设两个数组中无重复元素;//数组当两个数组长度相当时.//方法一:二路归并遍历两个数组,时间复杂度为O(n);对于数组nums1,nums2分别以i,j从头遍历数组。//        如果当前位置的nums1[i]==nums2[j],则这两个数是两个数组的一个交集,记录下来并继续遍历;//        如果nums1[i]>nums2[j],则继续遍历数组nums2,否则遍历数组nums1。//代码一:#include<iostream>#include<vector>using namespace std;vector<int> Mixed(vector<int> &nums1,vector<int> &nums2){    vector<int> mixed;unsigned int i=0;unsigned int j=0;while((i<nums1.size())&&(j<nums2.size())){if(nums1[i]<nums2[j])i++;else if(nums1[i]>nums2[j])j++;else{mixed.push_back(nums1[i]);i++;j++;}}return mixed;}int main(){int a[]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,20};int b[]={5,6,7,8,10,12,13,15,16,18,19,20};int len1=(sizeof(a)/sizeof(a[0]));int len2=(sizeof(b)/sizeof(b[0]));    vector<int> nums1(a,a+len1);vector<int> nums2(b,b+len2);vector<int>mixed=Mixed(nums1,nums2);for(unsigned int i=0;i<mixed.size();i++){cout<<mixed[i]<<endl;}system("pause");return 0;}//代码二:#include<iostream>using namespace std;int Mixed(int *nums1,int len1,int *nums2,int len2,int *mixed){    int i=0;int j=0;int k=0;while(i<len1&&j<len2){if(nums1[i]<nums2[j])i++;else if(nums1[i]>nums2[j])j++;else{mixed[k]=nums1[i];i++;j++;k++;}}return k;}int main(){int a[]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,20};int b[]={5,6,7,8,10,12,13,15,16,18,19,20};int len1=(sizeof(a)/sizeof(a[0]));int len2=(sizeof(b)/sizeof(b[0]));int len3=(len1<len2?len1:len2);    int *mixed=new int[len3];int count=Mixed(a,len1,b,len2,mixed);for(int i=0;i<count;i++){cout<<mixed[i]<<endl;}delete[] mixed;    system("pause");return 0;}//方法二:利用hash表,遍历两个数组中任意一个数组,将遍历得到的元素存放入hash表中,//        然后遍历另外一个数组,同时对建立的hash表进行查询,如果存在,则为交集元素;//        此方法数组可无序;#include<iostream>#include<vector>#include<unordered_map>using namespace std;vector<int> Mixed(vector<int> &nums1,vector<int> &nums2){    unordered_map<int,int>maping;    vector<int> mixed;for(unsigned int i=0;i<nums1.size();i++){maping[nums1[i]]=1;} for(unsigned int j=0;j<nums2.size();j++){    if(maping[nums2[j]]==1)       mixed.push_back(nums2[j]);}return mixed;}int main(){int a[]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,20};int b[]={1,2,3,5,6,7,8,10,12,13,15,16,18,19,20};int len1=(sizeof(a)/sizeof(a[0]));int len2=(sizeof(b)/sizeof(b[0]));vector<int>nums1(a,a+len1);vector<int>nums2(b,b+len2);    vector<int>mixed=Mixed(nums1,nums2);for(unsigned int i=0;i<mixed.size();i++){cout<<mixed[i]<<endl;}system("pause");return 0;}//当两个数组长度相差悬殊时,假设len1>>len2;//方法一:以此遍历长度较小的数组,将遍历得到的数组元素在长数组中进行二分查找;#include<iostream>using namespace std;int Mixed(int *nums1,int len1,int *nums2,int len2,int *mixed){    int count=0;for(int i=0;i<len2;i++){int start=0;int end=len1-1;while(start<=end){int mid=(start+end)/2;if(nums2[i]<nums1[mid])end=mid-1;else if(nums2[i]>nums1[mid])start=mid+1;else{mixed[count++]=nums2[i];break;}} }return count;}int main(){int a[]={1,2,3,4,5,6,7,8,10,12,20,21,22,23,24,25,26}; int b[]={5,6,7,8,10,12,13,14,15};int len1=(sizeof(a)/sizeof(a[0]));int len2=(sizeof(b)/sizeof(b[0]));int len3=(len1<len2?len1:len2);    int *mixed=new int[len3];int count=Mixed(a,len1,b,len2,mixed);for(int i=0;i<count;i++){cout<<mixed[i]<<endl;}delete[] mixed;    system("pause");return 0;}

0 0
原创粉丝点击