数组之求两个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
- 数组之求两个sorted Array的交集
- 求两个数组的交集
- 求两个数组的交集
- 求两个数组的交集
- 求两个数组的交集
- 求两个数组的交集
- 求两个数组的交集
- 求两个数组的交集
- 求两个数组的交集
- 求两个数组的交集
- 求两个数组的交集
- 求两个数组的交集
- 求两个数组的交集
- 求两个数组的交集
- 求两个数组的交集
- 计算机数学作业之求两个数组的交集问题
- 宝典练习2之求两个数组的交集
- python 基础编程之求两个数组的交集
- java基础入门之对象导论
- linux环境jdk安装及配置
- centos 7 安装五笔输入法
- 关于Maven
- Assign Cookies
- 数组之求两个sorted Array的交集
- 国际道教协会黄世真道长为《中华辟谷养生》题写序言!
- java中程序,进程和线程的区别
- shell编程笔记
- Relative Ranks
- openjudge 1.13 27:除以13
- android OKHTTP 的缓存问题
- linux C中调用shell命令和运行shell脚本
- 递归漫谈(一)