`
blackbeans
  • 浏览: 141636 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

很基础的求两个有序数组的交集和并集

 
阅读更多

 

 /**
     * 求解两个有序数组的交集
     * @param a
     * @param b
     * @return
     */
    public static List<Integer> join(int[] a , int[] b){
        List<Integer> list = new LinkedList<Integer>();
        int ai = 0;
        int bi = 0;
        while(ai < a.length && bi < b.length){
            if(a[ai] == b[bi]){
                //两个相等即交集
                list.add(a[ai]);
                ai++;
                bi++;
            }
            else if(a[ai] > b[bi]){
               //移动小得数组index
               bi++;
            }
            else{
                //移动小值得数组index
               ai ++;
            }
        }

        return list;
    }

    /**
     * 求解两个有序数组的并集
     * @param a
     * @param b
     * @return
     */
    public static List<Integer> merge(int[] a , int[] b){

        List<Integer> list = new LinkedList<Integer>();
        int ai = 0;
        int bi = 0;
        while(ai < a.length && bi < b.length){
            if(a[ai] < b[bi]){
                list.add(a[ai]);
                ai++;
            }
            else if(a[ai] > b[bi]){
                list.add(b[bi]);
                bi++;
            }
            else {
                list.add(a[ai]);
                ai++;bi++;
            }
        }

        //剩余的直接插入到结果集的末尾
        if(ai < a.length){
            for(;ai < a.length ; ai++){
               list.add(a[ai]);
            }
        }
        else if(bi < b.length){
            for(;bi < b.length ; bi++){
               list.add(b[bi]);
            }
        }

        return list;
    }
 
分享到:
评论
3 楼 draem0507 2013-07-11  

for (int i = 0; i < a.length; i++) {
			for (int j = 0;j < b.length; j++) {
				if(a[i].compareTo(b[j])==0){
					list.add(a[i]);
					break;
				}else if(a[i].compareTo(b[j])>0){
					list.add(b[j]);
					
				}else {
					list.add(a[i]);
					break;
					
				}
			}
		}
2 楼 draem0507 2013-07-11  

public static List<Integer> join2(Integer[] a, Integer[] b) {
		List<Integer> list = new ArrayList<Integer>();
		for (int i = 0; i < a.length; i++) {
			for (int j = 0;j < b.length; j++) {
				if(a[i].equals(b[j])){
					list.add(a[i]);
					break;
				}else if(a[i]<b[j]){
					break;
				}
				
			}
		}
		for (int i = 0; i < list.size(); i++) {
			System.out.println(list.get(i));
		}
		
		return list;
	}


对时间复杂度还不是很懂 先mark下吧
1 楼 draem0507 2013-07-11  
List<Integer> alist = new ArrayList<Integer>();
		for (int i = 0; i < a.length; i++) {
			alist.add(a[i]);
		}
		List<Integer> blist = Arrays.asList(b);
		alist.retainAll(blist);



 blist.removeAll(alist);
    blist.addAll(alist);


算法不好的人,伤不起。。

相关推荐

    JIHE.rar_交集 并集_数据结构 界面

    例如,对于两个有序表A和B,要找到它们的交集,我们只需从较小的表开始,逐个比较元素,如果元素同时存在于两个表中,就将其添加到结果集中。对于并集,我们可以简单地将两个表连接起来,然后去重,保持原有的排序...

    交并集和实验报告 数据结构

    为了实现这些功能,设计了两个抽象数据类型:有序表OrderedList和集合Set。有序表的数据对象是整数数组,要求元素按升序排列。其基本操作包括构造空表、销毁表、判断是否为空、获取长度、获取指定位置元素、查找元素...

    有序顺序表实现集合的各种运算

    1. **交集**:两个有序顺序表的交集是它们共有的元素。可以遍历较短的表,对每个元素在较长的表中进行二分查找,如果找到,则将该元素添加到结果集中。这样,交集操作的时间复杂度可以达到O(m log n),其中m和n分别...

    Python数组并集交集补集代码实例

    并集是指包含所有两个或多个集合中元素的新集合,不考虑重复项。在Python中,我们可以使用`set`对象的`union`方法或`|`运算符来实现。下面展示了两种实现方式: ```python a = ["a", "b", "c", "d"] b = ["b", ...

    Leecode初级算法_数组篇_实例

    例如,你可能会遇到查找数组中的最大值、最小值、特定元素,或者是两个数组的交集、并集等。这些题目对于理解数组的基本特性和操作非常有帮助,同时也训练了程序员的逻辑思维能力。 在Java中,处理数组时可以使用...

    集合运算(数据结构)函数

    - 最后,分别调用`jiao`、`bing`和`cha`函数计算交集、并集和差集,并通过`ListTraverse`函数输出结果。 ### 五、代码分析 该程序使用简单的线性搜索实现了集合的基本运算。尽管效率不是很高,但对于理解集合运算...

    数据结构课程设计之集合运算

    可以通过两次差集运算得到,或者先求交集再求两集合的并集,去掉交集部分。 5. 子集(Subset)和真子集(Proper Subset):判断一个集合是否是另一个集合的子集或真子集,可以通过遍历并逐一比较元素来实现。 6. ...

    用有序顺序表实现集合的各种运算

    例如,在交集运算中,需要将两个集合的元素合并成一个集合,并且保持集合的有序性。在差集运算中,需要将两个集合的元素相减,得到一个新的集合。 在实现集合运算时,需要使用到几个重要的函数。这些函数包括: * ...

    Python数据分析应用:检索数组元素.pptx

    除了以上介绍的函数,还有其他相关的数组操作函数,如`itemsize`用于获取数组元素的大小,`intersection1d()`用于找出两个数组的交集,`union1d()`用于计算并集,`setdiff1d()`用于找出在一个数组中但不在另一个数组...

    Python 比较两个数组的元素的异同方法

    当我们需要比较两个列表的元素时,我们可以使用集合(set)数据结构,因为集合提供了计算交集、并集和差集等操作,这些操作非常适合于这种目的。 1. **交集(Intersection)**: 交集表示两个集合共有的元素。在...

    "C语言程序设计大赛”模拟题库

    22. 有序数组交集:双指针遍历,合并两个有序数组。 23. 有序数组并集:去除重复元素,合并两个有序数组。 24. 删除指定范围元素:理解数组的动态调整和内存管理。 25. 单链表去重:遍历链表,使用哈希表辅助,...

    java jsonarray 踢重 去重操作

    在Java中处理JSON数据时,经常需要对JSON数组进行各种操作,其中去重是一个常见的需求。本文将详细介绍如何使用Java对`JSONArray`进行去重操作,并深入探讨背后的原理和技术细节。 ### JSON与Java JSON...

    数组集合矩阵习题PPT学习教案.pptx

    - **作业P163**:要求编写一个函数,将两个有序的一维数组`a`和`b`合并成一个新的有序数组`c`。这可以通过上述的并集算法实现,确保合并后的数组保持升序。 5. **程序填空**:给出的代码片段用于初始化一个二维...

    基于顶点的复杂多边形求交算法的实现

    5. **结果合并**:根据边-边测试、顶点测试和孔洞测试的结果,我们可以计算出两个多边形的交集、并集或差集。交集是两个多边形共享的部分,并集是它们的组合,差集是一一个多边形减去另一个。 在实现过程中,代码...

    Swift从入门到精通视频教程下载第6章 Swift集合类型——数组和字典.zip

    本章“Swift集合类型——数组和字典”深入讲解了这两个关键的内置数据结构,帮助开发者掌握如何有效地存储和管理数据。在iOS应用开发中,无论是存储用户信息、应用程序设置还是游戏得分,数组和字典都是不可或缺的...

    Java实验九:解决问题讲解(排序,数组,添加,删除的应用)

    并集是两个数组的所有元素,包括重复的,也通过遍历和复制数组实现,并在最后进行一次冒泡排序确保并集也是有序的。 7. **条件判断**:使用`if`语句检查两个排序后的数组是否相等,即所有元素都相同。如果相等,则...

    调用算法简化数组编程_washr3x_treatedsw5_algorithm_

    7. **集合操作**:`unique()`函数可以去除数组中的重复元素,`set_union()`、`set_intersection()`和`set_difference()`分别用于计算两个数组的并集、交集和差集。 在学习`&lt;algorithm&gt;`库时,重要的是要理解每个...

    集合类的菜单界面

    4. **交集**:交集操作需要遍历两个集合,将存在于两个集合中的元素添加到结果集合中。 5. **并集**:并集操作则将两个集合的所有元素都添加到结果集合中,但需去除重复元素。 6. **差集**:差集操作返回只存在于一...

    北师大版高一数学必修一集合测试题1.doc

    因此,选项 A, B 和 C 表示的都是解集,而选项 D 是一个有序数组,不是集合,所以答案是 D。 - (2) 这个问题没有提供具体选项,但通常涉及到集合元素的性质,比如空集的定义、集合包含关系等。 - (3) 同上,这个...

    离散数学实验

    输入方法读取用户提供的集合元素,显示方法用于打印集合内容,交集、并集和差集方法分别实现了对应的集合运算,而笛卡尔积方法则负责生成并打印所有的有序对。 通过实际操作,学生不仅能掌握集合运算的理论知识,还...

Global site tag (gtag.js) - Google Analytics