晚上闲来无事,想起前两天查资料时候,看到别人一篇博客标题关于数组的交集和并集,晚上也随便写写,权当督促自己坚持经常练习练习写写小Demo。如下,先来一段求有序数组的交集的代码,代码如下:

public static List<Integer> getIntersectionSorted(int[] a,int[] b){if(a == null || b == null)throw new NullPointerException("Array is Empty");List<Integer> mixList = new ArrayList<Integer>();int i = 0;int j = 0;while(i < a.length && j < b.length){if(a[i] == b[j]){mixList.add(a[i]);//当前结点值相同,所以下次判断结点,先往前移动一次再说do{   i++;}while(i < a.length -1 && a[i] == a[i+1]);//当前判断结点下一个结点值是否等于前一个,如果等于避免无谓的再一圈循环,直接移动到下一个结点do{j++;} while(j < b.length -1 && b[j] == b[j+1]);continue;}else if(a[i] > b[j]){j++;continue;}else if(a[i] < b[j]){i++;continue;}}return mixList;}

由以上代码我们知道上面的求法最差时间负责度为O(m+n)。如果我们的数组没有排序,以上的方式肯定行不通,下面贴出求两无序数组的并集的代码,代码如下:

 public static List<Integer> getIntersectionNotSortedUsingWhile(int[] a,int[] b){if(a == null || b == null)throw new NullPointerException("Array is Empty");List<Integer> mixList = new ArrayList<Integer>();int startIndex = 0;int i = 0;while(i<b.length){int temp = b[i];int j = startIndex;while(j <a.length){while(j < a.length -1 && a[j] == a[j+1]){j++;}if(a[j] == temp){//当前判断结点下一个结点值是否等于前一个,如果等于避免无意义的移动mixList.add(temp);swap(a,startIndex,j); //此处操作:将数组元素分成两部分,一部分已经判断过的元素,每次元素判断过后,将该元素移动到判断过的部分,下次判断从未判断部分开始继续判断//因为已经添加到mixList的元素没有必要再下一次循环去判断的必要了。(类似插入排序的意思)startIndex++;break;}j++;}i++;}return mixList;}    public static List<Integer> getIntersectionNotSortedUsingFor(int[] a,int[] b){if(a == null || b == null)throw new NullPointerException("Array is Empty");List<Integer> mixList = new ArrayList<Integer>();int startIndex = 0;for(int i = 0;i<b.length;i++){int temp = b[i];for(int j = startIndex;j<a.length;j++){while(j < a.length -1 && a[j] == a[j+1]){//当前判断结点下一个结点值是否等于前一个,如果等于避免无意义的移动j++;}if(a[j] == temp){mixList.add(temp);swap(a,startIndex,j);//同上startIndex++;break;}}}return mixList;} public static void swap(int[] a,int m,int n){int temp = a[m];a[m] = a[n];a[n] = temp;}

以上代码可知,以上算法的效率可能没有达到最优,自己感觉效率还没有那么差吧,稍微借鉴了下插入排序做了小小的优化,时间复杂度也相对稳定。

下面把自己求两个数组的并集的练习也贴出来,有什么地方不对,还希望园友指出。先求有序两个数组的并集代码如下:

public static List<Integer> getUnionSetSorted(int[] a,int[] b){if(a == null || b == null)throw new NullPointerException("Array is Empty");List<Integer> mixList = new ArrayList<Integer>();int i = 0,j = 0;while(i < a.length && j < b.length){if(a[i] == b[j]){mixList.add(a[i]);i++;while(i< a.length -1 && a[i] == a[i+1]){ //判断当前元素和下一个元素是否重复,重复元素直接前进一位i++;}j++;while(j< b.length -1 && b[j] == b[j+1]){j++;}}else if(a[i] < b[j]){mixList.add(a[i]);i++;while(i< a.length -1 && a[i] == a[i+1]){i++;}}else if(a[i] > b[j]){mixList.add(b[j]);j++;while(j< b.length -1 && b[j] == b[j+1]){j++;}}}while(i <a.length){ //判断合并循环退出时,a数组还没有添加完mixList.add(a[i]);i++;while(i< a.length -1 && a[i] == a[i+1]){i++;}}while(j < b.length){//同上mixList.add(b[j]);j++;while(i< a.length -1 && a[i] == a[i+1]){i++;}}return mixList;}

该代码的最差时间负责度也为O(M + N)。

下面我们求两个无序数组的并集的实现,代码如下:

public static List<Integer> getUnionSetNotSorted(int[] a,int[] b){if(a == null || b == null)throw new NullPointerException("Array is Empty");List<Integer> mixList = new ArrayList<Integer>();for(int i = 0;i<a.length;i++){if(!mixList.contains(a[i])){mixList.add(a[i]);}}for(int i = 0;i<b.length;i++){if(!mixList.contains(b[i])){mixList.add(b[i]);}}return mixList;}

该代码的实现时间负责度为O(n2)。最后求两个无序的数组的并集代码的效率还有待提高,暂时没有想到效率更高的实现,路过的园友还望不吝指教。

求两个数组的交集和并集相关推荐

  1. Java求两个数组的交集、差集、并集

    目录 Java求两个数组的并集,代码如下: Java求两个数组的交集,代码如下: Java求两个数组的差集,代码如下: 交集.差集.并集测试代码如下: Java求两个数组的并集,代码如下: /*** ...

  2. 最快速度求两个数组之交集算法与hash

    一个题目 该题目来自58同城的二面,用最快速度求两个数组之交集算法. 比如A={6,2,4,1},B={2,9,4,3},那么A&B={2,4}. 算法一:在大多数情况,也就是一般的情况下,大 ...

  3. 最快速度求两个数组之交集算法

    该题目来自58同城的二面,用最快速度求两个数组之交集算法. 比如A={6,2,4,1},B={2,9,4,3},那么A&B={2,4}. 算法一:在大多数情况,也就是一般的情况下,大家都能想出 ...

  4. java集合操作-----求两个集合的交集和并集

    java求两个集合的交集和并集 java如何求两个集合的交集和并集呢??其实java的API中已经封装了方法.今天写个简单的例子测试一下:(例子中以java.util.LinkedList为例) 求连 ...

  5. C/C++ 求两个集合的交集、并集、差集

    推荐阅读:Python基础自学实用笔记(总和篇)-By Ryan_3610 1.题目:求两个集合的交集.并集.差集 1.1代码 #include <iostream> #include & ...

  6. Python求两个list的交集、并集、差(补)集、对称差集的方法

    Python求两个list的交集.并集.差(补)集.对称差集的方法 摘要 1. 总结 1.1 求两个list的交.并.差(补).对称差集 - 使用set集合运算符 1.2 求两个list的交.并.差( ...

  7. java 时间段求并集,java集合操作-----求两个集合的交集和并集

    2019独角兽企业重金招聘Python工程师标准>>> java求两个集合的交集和并集 java如何求两个集合的交集和并集呢??其实java的API中已经封装了方法.今天写个简单的例 ...

  8. php 两个数组求交集_如何求两个数组的交集

    题目描述 给定两个数组,编写一个函数来计算它们的交集. 示例 1: 输入:nums1 = [1,2,2,1], nums2 = [2,2]输出:[2] 示例 2: 输入:nums1 = [4,9,5] ...

  9. java求两个集合的交集和并集,比较器

    求连个集合的交集: import java.util.ArrayList; import java.util.List; public class TestCollection {public sta ...

最新文章

  1. PHP经典乱码“口”字与解决办法
  2. 管理员修改文件的权限
  3. MySQL共享存储主备模式利用Keepalived实现双机高可用
  4. Python中通过PyPDF2实现PDF拆分
  5. vue控制多行文字展开收起
  6. kafka和zookeeper一键启停脚本(以及kafka关不掉问题解决)
  7. sql中count(0),count(1),count(),count(列名)
  8. LeetCode-----反转链表
  9. ES6之let能替代var吗?
  10. 钢铁雄心II HOI2 作弊码合辑
  11. 校验电话号码 手机号码正则表达式————转载
  12. 360手机:360手机刷机 救砖 Twrp、Root、Magisk、360N4S骁龙版、360N5、N5S、N6、N6Lite、N6PRO、N7、N7Lite、N7PRO、Q5、Q5Plus
  13. mongodb数据库
  14. 请给孩子多一点点空间
  15. matlab portcons,马科维茨投资组合理论(均方模型)学习笔记——基于Matlab(二)...
  16. 《西部世界》第三季开播,机器人会比人类更有人性吗?
  17. LSD(线段检测测试文件)
  18. 国外问卷调查回答问题有什么技巧?
  19. oracle cheatsheet,OracleDB Cheatsheet
  20. Pycharm和Pytorch安装教程配置环境以及遇到的问题:

热门文章

  1. BPR贝叶斯个性化排序算法
  2. 贝叶斯个性化排序(BPR)算法
  3. 2、AsyncTool框架实战使用
  4. 考试用计算机反思800字,考后反思作文800字
  5. 如何创新玩转HarmonyOS开发#厚积薄发
  6. android 快速亮暗屏_Android设备闪屏怎么办?手机屏幕一会亮一会暗怎么办
  7. 轻松实现在web页面中直接播放rtsp视频流
  8. PDF转PPT怎么转?好用的转换方法分享
  9. 性能优化01 - 图片压缩 (NDK 哈夫曼算法压缩)
  10. 商务白领通勤必备高音质蓝牙耳机,低延迟游戏高续航蓝牙耳机推荐