算法复习-查找有序数组的公共部分

一.在数组中查找指定元素

首先在查找数组的公共部分之前,先了解如何在一个有序数组中查找目标元素。

1.遍历算法

     遍历数组,比较数组中每个元素和目标元素。如果存在相等元素则返回true,否则返回false。

public boolean find(int target,int[] array) {
    boolean bool=false;
    for (int i = 0; i < array.length; i++)
    {
        if (target==array[i])
        {
            bool=true;
            break;
        }
    }
    return bool;
}

时间复杂度为O(n).

2.二分查找

    每次比较数组中值和目标元素,如果中值大于目标,则将end赋中值对应的位置,若中值小于目标,则将start赋值中值对应的位置。

public boolean mid_find(int target,int[] array)
{
    boolean bool=false;
    int start=0;
    int end=array.length;
    int mid;
    while (start<end)
    {
        mid=(start+end)/2;
        if (target<array[mid]) {
            end = mid;
        }
        else if(target>array[mid])
        {
            start=mid;
        }
        else
        {
            bool=true;
            break;
        }
    }
    return bool;
}

时间复杂度为O(logN)。

二.现在我们来看看如何查找两个有序数组的公共部分。

     e.g现有一个数组a[1,2,3,4,5,6],而另一个数组b为[2,4,7,9]。那么现在要求打印出两个数组的公共元素,算法如下。

1.遍历算法

对于数组a中的任意一个元素,都在b中进行遍历,找到相同元素则停止并进行打印。

public void find(int[] a,int[] b) {

    for (int target:a)
    for (int i = 0; i < b.length; i++)
    {
        if (target==b[i])
        {
            System.out.println(target);
        }
    }

}

假设数组a中的元素个数为N,数组b中的元素个数为M,则算法的复杂度为O(M*N);

2.二分算法

对于数组a中任意一个元素,在b中都进行二分查找。

public void mid_find(int[] a,int[] b)
{


    int mid;
    for (int target:a) {
        int start=0;
        int end=b.length;
        while (start < end) {
            mid = (start + end) / 2;
            if (target < b[mid]) {
                end = mid;
            } else if (target > b[mid]) {
                start = mid;
            } else {
                System.out.println(target);
                break;
            }
        }
    }

}

  若a得个数为N,b的个数为M,则复杂度为O(N*logM)。

3.模拟栈

对于数列a和b,分别设置两个指针指向两个数列的头指针

1)若a[i]小于b[j],则i=i+1。

2)若a[i]等于n[j],则打印该数,并i=i+1;j=j+1。

3)其中任意一个数组到达尾部算法结束。

public void stack(int[] a,int[] b)
{
    int i=0;
    int j=0;
    while (i<a.length&&j<b.length)
    {
        if (a[i]<b[j])
        {
            i++;
        }
        else if (a[i]>b[j])
        {
            j++;
        }
        else
        {
            System.out.println(a[i]);
            i++;
            j++;

        }
    }
}
复杂度为O(N+M);

  


猜你喜欢

转载自blog.csdn.net/qq_34814105/article/details/80792636