您的位置:首页 > 其它

Finding intersection of two sorted arrays

2012-08-09 09:58 190 查看
1. 题目:找出两个有序数组的交集。

2. 解析:给定数组a和b,a的长度为m,b的长度为n

  (1)最原始的方法,依次遍历a中每一个元素,并通过遍历b来判断a中元素是否在b中。时间复杂度O(m×n)

  (2)改进的算法,在b中查找a的元素改为二分查找,时间复杂度为O(mlgn)

  (3)因为a和b都是有序的,遍历a和b,并对a和b中的元素进行判断,如果a[i]<b[j] i++, 如果a[i]>b[j] j++, 如果a[i]==b[j] i++, j++。时间复杂度为O(m+n)

3. 分析:

  (1)当m很小,n很大时,O(mlgn)二分法查找的效率高于线性查找的O(m+n),剩下的情况,线性查找效率比较高。

  (2)当a和b中存在重复元素时,比如a={1,1,2,2,3},b={1,2,3}这时候使用(1)和(2)方法得到结果为:{1,1,2,2,3},使用(3)方法得到结果为:{1,2,3}。结果2更符合题目的要求。所以在有重复元素时,解法(3)更符合题目要求。

4. 代码:

View Code

#include <iostream>
#include <cassert>

using namespace std;

void arrayIntersection(int* a, int aLength, int* b, int bLength)
{
if (!a || !b)
{
return ;
}
int i=0;
int j=0;
while ((i<aLength) && (j<bLength))
{
if (a[i]<b[j])
{
i++;
}
else if (a[i]>b[j])
{
j++;
}
else
{
cout<<a[i]<<"  ";
i++;
j++;
}
}
cout<<endl;
}

int main()
{
enum {aLength=5,bLength=7};
int a[aLength]={1,4,4,5,6};
int b[bLength]={4,5,6,7,9,10,11};
arrayIntersection(a,aLength,b,bLength);
return 0;
}


5. 参考文章:

http://www.leetcode.com/2010/03/here-is-phone-screening-question-from.html

/article/7173846.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: