双指针法求两个有序集合交集与并集

1.利用数据的有序性和指针的动态变化求元素交集.核心函数Search_Common通过每次循环比较两个指针所指向数据的大小来递进较小序列的指针,直至一个指针到达序列尾部.
2.核心函数Search_All通过每次循环的比较将较小值进行添加并递进较小序列的指针,直至一个指针到达序列尾部,再将剩下的值都添加,防止遗漏.
代码如下:

1.求交集

 1 #include <iostream>
 2 #include <vector>
 3 
 4 using namespace std;
 5 
 6 //给定两个升序数组,利用双指针法进行合取操作并存储,算法复杂度为O(N)
 7 void Search_Common(int *a, int &length_a, int *b, int &length_b, vector<int> &container);
 8 
 9 int main(void)
10 {
11     int b[7] = {1, 3, 4, 5, 8, 19, 20};
12     int a[10] = {0, 2, 4, 5, 6, 8, 19, 20,67,99};
13     int length_a = sizeof(a) / sizeof(int);
14     int length_b = sizeof(b) / sizeof(int);
15     vector<int> container;
16 
17     Search_Common(a, length_a, b, length_b, container);
18 
19     for (long long unsigned int j = 0; j < container.size(); j++)
20         cout << container[j] << endl;
21 
22     return 0;
23 }
24 
25 void Search_Common(int *a, int &length_a, int *b, int &length_b, vector<int> &container)
26 {
27     int *pa = a;
28     int *pb = b;
29 
30     while (pa < a + length_a && pb < b + length_b)//结束条件为两个指针有一个到达数组末尾
31         if (*pa == *pb)
32         { 
33             container.push_back(*pa); //相同的项则添加,同时两指针前进一步
34             pa++;
35             pb++;
36         }
37         //永远让较小的指针前进,直至结束
38         else if (*pa > *pb)
39             pb++;
40         else
41             pa++;
42 }
View Code

 




#include <iostream>
#include <vector>

using namespace std;

//给定两个有序数组,利用双指针法进行析取操作并存储,算法复杂度为O(N)
void Search_All(int *a, int &length_a, int *b, int &length_b, vector<int> &container);

int main(void)
{
    int a[6] = {1, 3, 4, 19, 20,34};
    int b[7] = {0, 2, 4, 5, 18, 26, 29};
    int length_a = sizeof(a) / sizeof(int);
    int length_b = sizeof(b) / sizeof(int);
    vector<int> container;

    Search_All(a, length_a, b, length_b, container);

    for (long long unsigned int j = 0; j < container.size(); j++)
        cout << container[j] << endl;
    return 0;
}
2.求并集
void Search_All(int *a, int &length_a, int *b, int &length_b, vector<int> &container) { int i, j; i = j = 0; // 通过不断比较来更新i,j的值,针对每种情况做出相应变化 while (i < length_a && j < length_b)//两个指针有一个到达序列末尾时就跳出循环 { //不断添加较小值,添加后递进较小值序列的指针 if (a[i] > b[j]) { container.push_back(b[j]); j++; } else if (a[i] < b[j]) { container.push_back(a[i]); i++; } else//二者相等则添加其一,两个指针都递进 { container.push_back(a[i]); i++; j++; } } // 退出主循环后将剩余项全部加入. while (i < length_a) { container.push_back(a[i]); i++; } while (j < length_b) { container.push_back(b[j]); j++; } }

 

 

 

posted @ 2020-10-10 19:33  举觞  阅读(537)  评论(0)    收藏  举报