两个有序序列的共同元素

面试常问-算法 专栏收录该内容
9 篇文章 0 订阅

问题:

给定两个已排序序列,找出共同的元素.设分别为A,B,数组长度分别为M,N

方法1

定义两个指针分别指向序列的开始。如果指向的两个元素相等,则找到一个相同的元素;如果不等,则将指向较小元素的指针向前移动。重复执行上面的步骤,直到有一个指针指向序列尾端。

大致的code

void CommonElem(const int *A,int ASize,const int *B,int BSize,vector<int>& common)
{
    int i=0,j=0;
    while(i<ASize && j<BSize)
    {
        if(A[i] == B[j])
        {
            common.push_back(A[i]);
            ++i,++j;
        }
        else if(A[i]  > B[j]) ++j;
        else ++i;
    }
}

时间复杂度:O(M+N)

方法2:遍历一个元素个数较小的数组A,对于A[i],在另外一个数组B中二分查找A[i].

而且二分还是可以优化的,如果找到了,就可以重新设置二分查找的低位,没有找到则不变。因为两个数组都是已排序的,下一个出现的数字一定会在当前出现的数字之后。

时间复杂度:小于min(M,N)*log(max(M,N))

 

当两个数组长度接近时候使用方法1,当一个数组长度远大于另外一个的时候使用方法2,当然使用方法2的限制是元素序列是顺序存储。

 

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值