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

  rt,这是一个经典问题。

参考1http://www.sysexpand.com/?path=exercises/array-intersection

参考2http://leetcode.com/2010/03/here-is-phone-screening-question-from.html

用数组来模拟(本质上说集合中是没有重复元素的,这里用数组来模拟可以用重复元素),AB数组长度分别为mn。总的来说,分为以下几种方案。

方案1:两重循环判断(复杂度 Om*n))

暴力方法,并且不容易去除重复元素

方案2:Hash Table方法(复杂度 Om+n))

   A写入Hash Table,让后BHash Tabe中写入过程中判断重复即可。如果没有重复元素,唯一缺点是内存占用量大,可以使用《编程珠玑》中的BitMap方法节省内存。另外Hash过程中可能会有比较多的冲突。

另外,本方法不具有普遍性。

方案3:排序后对A中每个元素在B中进行二分查找(复杂度 O(nlogn+mlogm)

    这里m<=n。否则排序后对B中每个元素在A中进行二分查找(复杂度 On*lgm

 

注意,排序的复杂度是O(nlogn+mlogm),查找的复杂度是On*lgm)。

方案4:排序后应用归并排序的思想进行判断(复杂度 O(nlogn+mlogm)

   指针ij分别指向AB的开头,如果对应元素相等即为交集,否则谁小谁的指针加1往后移动。

  注意,排序的复杂度是O(nlogn+mlogm),归并过程是Om+n),比方案3更优。

  下面是实现部分,并且去除了重复元素。

/**  * 创建时间:2014年8月16日 上午11:46:12  * 项目名称:Test  * @author Cao Yanfeng   Peking University * @since JDK 1.6.0_21  * 类说明:测试两个数组的交集,交集中不包含重复数  */
public class Intersectionof2ArraysTest {/*** @param args*/public static void main(String[] args) {// TODO Auto-generated method stubint[] array1={4,6,2,4,3,5,1};int[] array2={4,4,9,6,8,7,5,5,6,7};LinkedList linkedList=Intersectionof2Arrays(array1, array2);for (Integer integer : linkedList) {System.out.println(integer);}}public static LinkedList Intersectionof2Arrays(int[] array1,int[] array2) {LinkedList linkedList=new LinkedList();int m=array1.length;int n=array2.length;quicSort(array1, 0,m-1);quicSort(array2, 0,n-1);/*初步判断两种没有任何交集的情况*/if (array1[0]>array2[n-1]|array1[m-1]= temp) {end--;}arr[start] = arr[end];while (start < end && arr[start] <= temp) {// 括号中end--之后可能不满足条件start++;}arr[end] = arr[start];}arr[start] = temp;return start;}}




本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部