有两个有序整数集合a和b,写一个函数找出它们的交集?
来源:互联网 发布:网络词凉凉是什么意思 编辑:程序博客网 时间:2024/05/17 02:15
方法一:
private static Set<Integer> setMethod(int[] a,int[] b){ Set<Integer> set = new HashSet<Integer>(); Set<Integer> set2 = new HashSet<Integer>(); for(int i=0; i<a.length; i++) { set.add(a[i]); } for(int j=0; j<b.length; j++) { if(!set.add(b[j])) set2.add(b[j]); } return set2; }
private static Set<Integer> forMethod(int[] a,int[] b){ Set<Integer> set=new HashSet<Integer>(); int i=0,j=0; while(i<a.length && j<b.length){ if(a[i]<b[j]) i++; else if(a[i]>b[j]) j++; else{ set.add(a[i]); i++; j++; } } return set; }
private static int[] intersect(int[] a, int[] b) { if (a[0] > b[b.length - 1] || b[0] > a[a.length - 1]) { return new int[0]; } int[] intersection = new int[Math.max(a.length, b.length)]; int offset = 0; for (int i = 0, s = i; i < a.length && s < b.length; i++) { while (a[i] > b[s]) { s++; } if (a[i] == b[s]) { intersection[offset++] = b[s++]; } while (i < (a.length - 1) && a[i] == a[i + 1]) { i++; } } if (intersection.length == offset) { return intersection; } int[] duplicate = new int[offset]; System.arraycopy(intersection, 0, duplicate, 0, offset); return duplicate; }
三种性能对比测试:
public class NumberCrossTest { public static void main(String[] args) { int[] a1 = new int[100000]; for (int i = 0; i < a1.length; i++) { a1[i] = i + 10; } int[] a2 = new int[200000]; for (int i = 0; i < a2.length; i++) { a2[i] = i + 20; } long begin = System.currentTimeMillis(); Set<Integer> set1 = setMethod(a1, a2); long end = System.currentTimeMillis(); System.out.println(end - begin);// 359 begin = System.currentTimeMillis(); Set<Integer> set2 = forMethod(a1, a2); end = System.currentTimeMillis(); System.out.println(end - begin);// 160 begin = System.currentTimeMillis(); int[] c = intersect(a1, a2); end = System.currentTimeMillis(); System.out.println(end - begin);// 10 // 测试两种方法的结果是否相等 System.out.println(set1.equals(set2));// true Set<Integer> set3 = new HashSet<Integer>(); for (int i = 0; i < c.length; i++) { set3.add(c[i]); } System.out.println(set1.equals(set3));// true } private static Set<Integer> setMethod(int[] a, int[] b) { Set<Integer> set = new HashSet<Integer>(); Set<Integer> set2 = new HashSet<Integer>(); for (int i = 0; i < a.length; i++) { set.add(a[i]); } for (int j = 0; j < b.length; j++) { if (!set.add(b[j])) set2.add(b[j]); } return set2; } private static Set<Integer> forMethod(int[] a, int[] b) { Set<Integer> set = new HashSet<Integer>(); int i = 0, j = 0; while (i < a.length && j < b.length) { if (a[i] < b[j]) i++; else if (a[i] > b[j]) j++; else { set.add(a[i]); i++; j++; } } return set; } private static int[] intersect(int[] a, int[] b) { if (a[0] > b[b.length - 1] || b[0] > a[a.length - 1]) { return new int[0]; } int[] intersection = new int[Math.max(a.length, b.length)]; int offset = 0; for (int i = 0, s = i; i < a.length && s < b.length; i++) { while (a[i] > b[s]) { s++; } if (a[i] == b[s]) { intersection[offset++] = b[s++]; } while (i < (a.length - 1) && a[i] == a[i + 1]) { i++; } } if (intersection.length == offset) { return intersection; } int[] duplicate = new int[offset]; System.arraycopy(intersection, 0, duplicate, 0, offset); return duplicate; }}
结果对比:
方法一用时:359 毫秒
方法二用时:160 毫秒
方法三用时:10 毫秒
0 0
- 有两个有序整数集合a和b,写一个函数找出它们的交集
- 有两个有序整数集合a和b,写一个函数找出它们的交集?
- A、B两个整数集合的交集
- 两个整数集合A和B,求其交集
- A、B两个整数集合,设计一个算法求他们的交集,尽可能的高效
- A、B两个整数集合,设计一个算法求他们的交集,尽可能的高效
- A、B两个整数集合,设计一个算法求他们的交集,尽可能的高效
- A、B两个整数集合,设计一个算法求他们的交集,尽可能的高效。
- A,B两个整数集合,设计一个算法求他们的交集,尽可能的高效
- A、B两个整数集合,设计一个算法求他们的交集,尽可能的高效
- A、B两个整数集合,设计一个算法求他们的交集,尽可能的高效。
- A、B两个整数集合,设计一个算法求他们的交集,尽可能的高效。
- A、B两个整数集合,设计一个算法求他们的交集,尽可能的高效。
- A、B两个整数集合,设计一个算法求他们的交集,尽可能的高效
- A、B两个整数集合,设计一个算法求他们的交集
- A,B两个整数集合,设计一个算法求他们的交集
- A,B两个整数集合,设计一个算法求他们的交集,尽可能的高效(牛客网)
- 给定一个值S,在有序数组中找出两个元素A和B,使 A+B = S.
- BZOJ 2844 albus就是要第一个出场(线性基)
- 同一个Fragment重复加载的问题
- 数据库中的范式学习
- 递归算法实现二分查找
- json 遍历的削笔机
- 有两个有序整数集合a和b,写一个函数找出它们的交集?
- JAVA中 @Override 的作用
- eclipse中运行带图标tomcat未报错并且也跑不起来的问题
- Maven入门
- ZooKeeper系列之三:Zookeeper常用命令
- 解决mysql中只能通过localhost访问不能通过ip访问的问题
- Android实现网络多线程断点续传下载
- UOJ 67 新年的毒瘤 (tarjan算法求割点)
- Execution failed for task ':app:transformNative_libsWithStripDebugSymbolForDebug'.