当前位置: 首页 > news >正文

逐行输出三个顺序表中共同存在的元素

给定三个序列A,B,C,长度均为n,且均无重复元素的递增序列,设计一个时间上尽可能高效的算法,逐行输出同时存在于这三个元素中的所有元素。例如数组A为{1,2,3},数组B为{2,3,4},数组C为{-1,0,2},则输出2。

思想:定义三个移动指针,开始分别指向三个数组的第一个元素,比较三个指针指的元素大小,当相等时,输出该元素,并将三个指针加1,向后遍历,否则,向后移动最小的一个元素指针,至到移除数组范围后,停止。

具体例子:

数组A为{1,2,3,4},数组B为{2,3,4,5},数组C为{-1,0,2,3,4}

开始时,i指向1,j指向2,k指向-1,均不相等,最小的为k,k进行向后移动,指向0,此时依然最小,继续往后,指向2,此时三个数字中最小的是i指向1,将i向后面移动,指向2,此时i,j,k均指向2,相等,输出2,并将三个指针向后面移动。

此时i指向3,j指向3,k指向3,相等,输出3,将三个指向后移。

此时i指向4,j指向4,k指向4,相等,输出4,将三个指向后移。

此时i超出数组范围,停止向后遍历,最后输出2,3,4。

代码:

void samekey(int A[],int B[],int C[],int n){int i=0,j=0,k=0;//三个工作指针,开始时,均指向表中的第一个元素 while(i<n&&j<n&&k<n){if(A[i]==B[j]&&B[j]==C[k]){//三个指针指向相同元素则输出 printf("%d\n",A[i]);i++;//指针均向后移动 j++;k++;}else{int Maxnum=max(A[],max(B[],C[]));//找出三个指针指向的最大元素 if(A[i]<Maxnum) i++;//将比最大元素校的元素向后面移动 if(B[j]<Maxnum) j++;if(C[k]<Maxnum) k++;}}
}

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


http://www.mrgr.cn/news/15804.html

相关文章:

  • winform中chart的Axis.LabelStyle 属性
  • sqlite数据插入效率
  • 集成电路学习:什么是CRC循环冗余校验
  • cucumber 怎么启动API
  • 对mozjpeg中的函数名进行替换
  • 用矩阵乘法的底层原理来理解“特征融合”
  • Android强制设置所有应用显示方向,忽略应用本身的设置
  • 【面试题系列Vue06】Vue 单页应用与多页应用的区别
  • 损失函数、成本函数cost 、最大似然估计
  • 五,Spring Boot中的 Spring initializr 的使用
  • Runway删库跑路,真的run away了!
  • net6 core 接入nacos 实现服务注册入门使用,心跳检测和负载均衡
  • 从零开始:全面掌握C++ Qt开发框架基础
  • C#——扩展方法
  • 【2024 CCF编程能力等级认证(GESP)C++ 】一级大纲
  • pytorch view 函数介绍
  • 【大模型项目实战】练完这些项目,天下没有再难倒你的大模型
  • 集成电路学习:什么是DAC数模转换器
  • 从开题到答辩:ChatGPT超全提示词分享!(下)【建议收藏】
  • 【C++】智能指针