LC.1213 | 三个有序数组的交集 | 数组 | 三指针

输入:三个 严格递增排序 的整数数组 arr1arr2arr3
输出:仅在三个数组中 同时出现 的整数构成的有序数组。


思路:三指针同步遍历法

  • 定义三个指针 i, j, k,分别指向三个数组当前考察的位置。
  • arr1[i] == arr2[j] == arr3[k] 时,说明该元素同时存在于三个数组中,加入结果并同时前进。
  • 否则,找到当前三个值中的最小值,让指向该最小值的指针前进(因为小的值不可能再出现在其他数组中)。
  • 当任意一个数组遍历结束时,交集计算完成。

时间复杂度:O(n)
空间复杂度:O(1)


class Solution {
public:
    vector<int> arraysIntersection(vector<int>& arr1, vector<int>& arr2, vector<int>& arr3) {
        int i = 0, j = 0, k = 0;
        vector<int> result;

        while (i < arr1.size() && j < arr2.size() && k < arr3.size()) {
            // 三个相等 -> 加入结果并前进
            if (arr1[i] == arr2[j] && arr2[j] == arr3[k]) {
                result.push_back(arr1[i]);
                i++, j++, k++;
            } 
            // 找出最小值并前进
            else {
                int minVal = min({arr1[i], arr2[j], arr3[k]});
                if (arr1[i] == minVal) i++;
                if (arr2[j] == minVal) j++;
                if (arr3[k] == minVal) k++;
            }
        }

        return result;
    }
};
c++实现【有序表的归并(顺序)】 题目详情:编写函数实现将两个有序表La和Lb合并到Lc中,还是一个有序表。 (1)前置代码: #include <stdlib.h> #include <stdio.h> # define List_Init_Size  100 # define ListIncrement   10 typedef  int ElemType;       //定义数据元素的类  typedef  struct {              ElemType   *elem;  //存储空间基址     int        length; //当前长度(数据元素个数)     int        ListSize;//当前分配的存储容量 } Sqlist;           //定义顺序表的类  void InitList (Sqlist &L); void Input(Sqlist &L); void Output(Sqlist L); int Locate(Sqlist L, ElemType x);  void InsertList(Sqlist &L,int i,ElemType x) ;  void GetElem(Sqlist L,int i, ElemType &e);//获取表L中第i个元素,存入e中  void Intersec(Sqlist La,Sqlist Lb,Sqlist &Lc) ;//La和Lb的交集,结果存到Lc中  void Mergelist(Sqlist La,Sqlist Lb,Sqlist &Lc);//将有序表La和Lb归并到Lc  int main() { int i,x,loc; Sqlist La,Lb,Lc; InitList(La);//初始化La  InitList(Lb);//初始化Lb  InitList(Lc);//初始化Lc  Input(La);//输入La的元素 升序  Input(Lb);//输入Lb的元素  升序      Mergelist(La,Lb,Lc);//将实现Lc=La归并Lb  Output(Lc);//输出Lc  } //初始化顺序表  void InitList (Sqlist &L){ L.elem=(ElemType *)malloc(List_Init_Size*sizeof(ElemType));//为顺序表分配一个大小为List_Init_Size的数组空间     if (!L.elem) exit(0) ;     L.length=0;     L.ListSize=List_Init_Size;     } //查找元素x,找到返回序号,找不到返回0  int Locate(Sqlist L, ElemType x) {   int i=1;     while(i<=L.length && L.elem[i-1]!=x)         ++i;     if(i<=L.length)  return i;     else return 0; } //输入n个数据元素  void Input(Sqlist &L) {     int n,x;     scanf ("%d",&n);     for (int i=1;i<=n;i++)     {         scanf ("%d",&x);         L.elem[i-1]=x;         L.length++;     } } //插入一个元素 void  InsertList(Sqlist &L,int i,ElemType x)    {          if(i <1 || i >L.length+1)     {printf("Position error");         return;     }     if(L.length>=L.ListSize)     {printf("overflow");         exit(EXIT_FAILURE);     }     for(int j=L.length-1;j>= i-1;--j)         L.elem[j+1]=L.elem[j];     L.elem[i-1]=x;     ++L.length;         }  //获取顺序表L中的第i个元素,并存到e中   void GetElem(Sqlist L,int i, ElemType
03-18
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值