解题思路:

暴力的时间复杂度是n^2,因为这道题的数据规模较小,也可以通过

代码实现如下:

#include <stdio.h>
#include <stdlib.h>

int gg(const void* x,const void *y){
	return *(int *)x-*(int *)y;
}

int main ()
{
	int i,j,k=0;
	int l[100001]={0};
	//int s[100001]={0};
	int p[100001]={0};
	int n,m,x;
	scanf("%d %d",&n,&m);
	for(i=0;i<n;i++){
		scanf("%d",&l[i]);
	} 
	for(i=0;i<m;i++){
		scanf("%d",&x);
		for(j=0;j<n;j++){
			if(x==l[j]){
				p[k++]=x;
				break;
			}
		}
	}
	qsort(p,k,sizeof(int),gg);
	for(i=0;i<k;i++){
		printf("%d ",p[i]);
	}
	return 0;
}

双指针,指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个相同方向(快慢指针)或者相反方向(对撞指针)的指针进行扫描,从而达到相应的目的。

换言之,双指针法充分使用了数组有序这一特征,从而在某些情况下能够简化一些运算。

代码实现如下:

#include <stdio.h>
#include <stdlib.h>
 
int cmp_int(const void *a, const void *b) {
    return *(int *) a - *(int *) b;
}
 
int main() {
    // 输入
    int n, m;
    scanf("%d%d", &n, &m);
    int A[n];
    for (int i = 0; i < n; ++i) {
        scanf("%d", &A[i]);
    }
    int B[m];
    for (int i = 0; i < m; ++i) {
        scanf("%d", &B[i]);
    }
 
    // 排序
    qsort(A, n, sizeof(A[0]), cmp_int);
    qsort(B, m, sizeof(B[0]), cmp_int);
 
    // 查找交集
    int i = 0, j = 0;
    while (i < n && j < m) {
        if (A[i] == B[j]) {
            printf("%d ", A[i]);
            i++;
            j++;
        } else if (A[i] > B[j]) {
            j++;
        } else {
            i++;
        }
    }
 
    return 0;
}


点赞(0)
 

0.0分

1 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论