A,B两个整数集合,设计一个算法求他们的交集,尽可能的高效(牛客网)

#include<iostream>
using namespace std;
/*
1)先使用快速排序,使得两个数组有序;
2)然后利用二分查找的方法,在数组B中查找;
3)其中,注意在数组B中,使用二分查找的起点,是根据上次查找的结果开确定的;这样可以进一步提高速度;
*/
int Sort(int array[],int low,int high)
{
	int temp=array[low];
	int pos=low;
	while(low<high)
	{
		while(array[high]>temp && high>low)high--;
		if(high>low)array[low]=array[high];
		while(array[low]<temp && high>low)low++;
		if(low<high)array[high]=array[low];
	}
	array[low]=temp;
	return low;
}
void QuickSort(int array[],int low,int high,int len)
{
    if(low<high)
	{
		int mid=Sort(array,low,high);
		QuickSort(array,low,mid-1,len);
		QuickSort(array,mid+1,high,len);
	}
}

int BinarySearch(int array[],int len,int start,int key)
{
	int pos=-1;
	int low=start;
	int high=len-1;
    int mid=0;
    while(low<=high)
	{
		mid=(low+high)/2;
		if(key>array[mid])low=mid+1;
		else if(key<array[mid])high=mid-1;
		else if(key==array[mid]) {pos=mid;break;}
	}
	return pos;
}
void Output(int array_A[],int array_B[],int len_A,int len_B)
{
	QuickSort(array_A,0,len_A-1,len_A);
    QuickSort(array_B,0,len_B-1,len_B);
	int i=0,j=0,current=0;//current 记录当前查找的位置;
	int*array_C =new int [len_A];
	int count=0;
	for(i=0;i<len_A;i++)
	{
		j=BinarySearch(array_B,len_B,current,array_A[i]);
		if(j==-1){continue;}
		else{
			array_C[count]=array_A[i];
			count++;
			current=j+1;
		}
	}
	if(array_C!=NULL)
	{
		for(i=0;i<count;i++)
		{
			cout<<array_C[i]<<" ";
		}
		cout<<endl;
	}
	delete []array_C;
	array_C=NULL;
}

int main()
{
	int array_A[10]={5,1,7,3,9,0,45,8,12,11};
	int array_B[10]={15,1,17,3,23,0,45,33,12,11};
	int len_A=10;
	int len_B=10;
    Output(array_A,array_B,len_A,len_B);
	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-15 05:26:15

A,B两个整数集合,设计一个算法求他们的交集,尽可能的高效(牛客网)的相关文章

A、B两个整数集合,设计一个算法求他们的交集

代码留作记录,本人水平有限,看了别人的解法真是自愧不如. 关于此题的详细探讨可以参考:http://blog.csdn.net/thebestdavid/article/details/12056293 /*A.B两个整数集合,设计一个算法求他们的交集,尽可能的高效.*/ #include <iostream> #include <cstring> #include <set> #define M 8 #define N 5 using namespace std; i

设计一个算法求节点值为x和节点y值得两个节点的最近共同祖先

思想:采用非递归后序遍历二叉树b.当找到节点值为x的节点时将栈中所有节点值存放在anorx数组中(如图所示的二叉树,F节点的anorx为"ACF"),当找到节点值为y的节点时将栈中所有节点值存放在anory数组中(对于如图所示的二叉树,E节点的anory为"ACE"),当两个节点均已找到后,通过比较找到他们最近的公共祖先(对于如图所示的二叉树,F和E节点的最近公共祖先为C),对应的算法如下: int commancestor(BTNode *b,ElementTyp

A、B两个整数集合的交集

rt,这是一个经典问题. 参考1:http://www.sysexpand.com/?path=exercises/array-intersection 参考2:http://leetcode.com/2010/03/here-is-phone-screening-question-from.html 用数组来模拟(本质上说集合中是没有重复元素的,这里用数组来模拟可以用重复元素),A.B数组长度分别为m和n.总的来说,分为以下几种方案. 方案1:两重循环判断(复杂度 O(m*n)) 暴力方法,并

C++程序设计实践指导1.5求两个整数集合并集改写要求实现

改写要求1:改写为单链表结构可以对任意长度整数集合求并集 #include <cstdlib> #include <iostream> using namespace std; struct LinkNode { int data; LinkNode* next; }; class SET { public: struct LinkNode* creat(int x[],int len); struct LinkNode* copy(LinkNode* aHead); int no

剑指offer系列——二维数组中,每行从左到右递增,每列从上到下递增,设计一个算法,找其中的一个数

题目:二维数组中,每行从左到右递增,每列从上到下递增,设计一个算法,找其中的一个数 分析: 二维数组这里把它看作一个矩形结构,如图所示: 1 2 8 9 2 4 9 12 4 7 10 13 6 8 11 15 在做这道题的时候我最先考虑的是每次比较对角线上的元素可能可以取得较好的效果, 以查找9为例, 从1(0,0)开始,1<10,可以得出结论,10在1的右侧或下侧: 1 2 8 9 2 4 9 12 4 7 10 13 6 8 11 15 然后看4(1,1),4<9, 1 2 8 9 2

输入两个实数,用一个函数求出它们之和

/*p180 例7.4 输入两个实数,用一个函数求出它们之和 解题思路:首先要定义add函数,它为float型,它应有两个参数,也应为float型. 特别注意:要对add函数进行声明.*/ #include<stdio.h>int main(){ float add(float x,float y); //对add函数作声明 float a, b, c; printf("please enter a and b:"); //提示输入 scanf("%f,%f&qu

网易2017秋招编程题集合-牛客网

网易2017秋招编程题集合-牛客网 链接:https://www.nowcoder.com/questionTerminal/0147cbd790724bc9ae0b779aaf7c5b50来源:牛客网 如果一个数字序列逆置之后跟原序列是一样的就称这样的数字序列为回文序列.例如: {1, 2, 1}, {15, 78, 78, 15} , {112} 是回文序列, {1, 2, 2}, {15, 78, 87, 51} ,{112, 2, 11} 不是回文序列. 现在给出一个数字序列,允许使用一

网易2017秋招编程题集合_以下代码全部来自牛客网

如果一个数字序列逆置之后跟原序列是一样的就称这样的数字序列为回文序列.例如:{1, 2, 1}, {15, 78, 78, 15} , {112} 是回文序列, {1, 2, 2}, {15, 78, 87, 51} ,{112, 2, 11} 不是回文序列.现在给出一个数字序列,允许使用一种转换操作:选择任意两个相邻的数,然后从序列移除这两个数,并用这两个数字的和插入到这两个数之前的位置(只插入一个和).现在对于所给序列要求出最少需要多少次操作可以将其变成回文序列. 链接:https://ww

2017年校招全国统一模拟笔试(第二场)编程题集合-牛客网

 2017年校招全国统一模拟笔试(第二场)编程题集合-牛客网 链接:https://www.nowcoder.com/questionTerminal/276712b113c6456c8cf31c5073a4f9d7来源:牛客网 牛牛有两个字符串(可能包含空格),牛牛想找出其中最长的公共连续子串,希望你能帮助他,并输出其长度. 输入描述: 输入为两行字符串(可能包含空格),长度均小于等于50. 输出描述: 输出为一个整数,表示最长公共连续子串的长度. 输入例子: abcde abgde 输出例子