`

区间合并

    博客分类:
  • java
 
阅读更多
给定一组区间,合并所有重叠的间隔。

例如:
[1,3],[2,6],[8,10],[15,18]

返回:
[1,6],[8,10],[15,18]

   

    解决思路:

    首先我们需要创建一个区间类,类中属性为start和end并且实现排序,我们队排序后的区间类进行判断

    例如区间类为A ,我们需要循环区间类集合,比较两个区间类A1,A2如果A1.start>=A2.end则我们人A1,A2是可以合并的。

   

public class MergeIntervals implements Comparable<MergeIntervals> {

    private int start;// 时间间隔开始位置
    private int end;// 时间价格结束位置

    public MergeIntervals(int start, int end) {

        this.start = start;
        this.end = end;
    }

    public MergeIntervals() {
    }

    /**
     * 合并时间间隔
     * 
     * @param list 需要合并的时间间隔集合
     * @return 合并后的时间间隔集合
     */
    public List<MergeIntervals> merge(List<MergeIntervals> list) {

        // 最终要返回的结果集
        List<MergeIntervals> resluts = new ArrayList<MergeIntervals>();

        // 如果集合为空或者size小于等于1则无需合并
        if (list == null || list.size() <= 1) {
            return list;
        } else {
            // 首先对集合进行排序
            Collections.sort(list);
            // 取出list中的第一个间隔
            MergeIntervals pre = list.get(0);

            for (int i = 1; i < list.size(); i++) {
                // 取出当前的时间间隔
                MergeIntervals curr = list.get(i);

                // 如果前一个间隔的结束位置大于后一个间隔的开始位置说明两个间隔存在交叉,可以合并
                if (pre.end >= curr.start) {
                    pre = new MergeIntervals(pre.start, Math.max(pre.end, curr.end));
                } else {
                    // 否则不能合并
                    resluts.add(pre);
                    pre = curr;
                }

            }
            resluts.add(pre);
        }
        return resluts;
    }

    /**
     * 比较器 用于对集合中的时间间隔进行排序
     * 
     * @param o
     * @return
     * @see java.lang.Comparable#compareTo(java.lang.Object)
     */
    @Override
    public int compareTo(MergeIntervals o) {
        return this.start - o.start;
    }

    public static void main(String[] args) {

        MergeIntervals test = new MergeIntervals();
        List<MergeIntervals> list = new ArrayList<MergeIntervals>();
        MergeIntervals mergeIntervals = new MergeIntervals(1, 3);
        MergeIntervals mergeIntervals1 = new MergeIntervals(2, 6);
        MergeIntervals mergeIntervals2 = new MergeIntervals(8, 10);
        MergeIntervals mergeIntervals3 = new MergeIntervals(15, 18);
        list.add(mergeIntervals);
           list.add(mergeIntervals1);
           list.add(mergeIntervals2);
           list.add(mergeIntervals3);

        List<MergeIntervals> list2 = test.merge(list);

        for (MergeIntervals mm : list2) {
            System.out.println(mm.start + "--" + mm.end);
        }
    }
}

 

分享到:
评论

相关推荐

    C语言多区间合并的简单实现

    给定一组区间,表示为[start,end],请给出方法,将有重叠的区间进行合并。例如: 给定:[1,3],[2,6],[8,10],[15,18], 合并:[1,6],[8,10],[15,18]. 此文件只是简单的实现, 没有考虑复杂度等问题

    相邻区间合并

    区间 合并,算法上常用的,大家可以下来参考,但是不提倡直接拷贝

    区间合并.c

    区间合并.c

    区间调度问题之区间合并.md

    区间调度问题之区间合并.md

    NullPointerC#Prepared-For-Better-Offer#区间合并1

    区间合并如果两个区间有交集,则将区间合并为一个区间与区间之间的关系分为三类:彼此互不相交后一个区间被前一个区间包含后一个区间与前一个有相交的部分// 将所有存在

    算法-区间合并(信息学奥赛一本通-T1236).rar

    算法-区间合并(信息学奥赛一本通-T1236).rar

    IP区间合并工具-windows

    windows 下对多ip及ip段进行相同合并处理并输出合并后的ip段,方便网络管理员进行管理,来源于github开源项目

    区间合并:以括号形式合并区间-matlab开发

    合并任务的一个简单的函数: 给定括号形式的 N 个输入闭区间: Ii := [left(i),right(i)], i = 1,2...,N(数学符号)。 集合union(Ii)可以按间隔Jk写为规范分区; 即,union{Ii) = union(Jk),其中Jk 是M 个区间...

    c++合并排序算法递归与非递归方式

    c++实现的合并排序算法 用递归和非递归两种方式实现的

    论文研究-归纳式学习中连续型数据的区间划分问题.pdf

    本文在类相关离散化方法的基础上 ,提出了用极大熵法进行初始区间划分 ,用多因素优选法调整区间的边界 ,二阶概率统计检验与实际意义相结合进行区间合并的一整套划分区间的方法 ,并用本文建立的新方法体系对中国宏观...

    Oracle时间区间段合并.pdf

    Oracle时间区间段合并统计的算法

    多区间概念格的动态横向合并算法

    为准确高效的完成数据的准备工作,提出在属性集不同、对象集相同形式背景下多区间概念格的动态横向合并算法.首先,为保证格结构的完整性,对区间概念格的渐进式生成算法进行改进,将区间概念分为存在概念、冗余概念和空...

    python 实现合并区间

    # 给出一个区间的集合,请合并所有重叠的区间 # 示例 1: # 输入: [[1,3],[2,6],[8,10],[15,18]] # 输出: [[1,6],[8,10],[15,18]] # 解释: 区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6] # 示例 2: # 输入: [[1,4...

    合并区间.md

    合并区间.md

    LeetCode题目分类与面试问题整理

    区间合并 q56_合并区间 字符串操作 q6_Z字形变换 q14_最长公共前缀 q763_划分字母区间 数字操作 q7_整数反转 q8_字符串转换整数 q9_回文数 q43_字符串相乘 q172_阶乘后的零 q258_各位相加 数组操作 q54_螺旋矩阵 q73...

    LeetCode题目分类与面试问题整理,附带所有java算法代码

    区间合并 q56_合并区间 字符串操作 q6_Z字形变换 q14_最长公共前缀 q763_划分字母区间 数字操作 q7_整数反转 q8_字符串转换整数 q9_回文数 q43_字符串相乘 q172_阶乘后的零 q258_各位相加 数组操作 q54_螺旋矩阵 q73...

    建议收藏算法基础课模板大全

    区间合并 数据结构 —— 代码模板链接 常用代码模板2——数据结构 链表与邻接表:树与图的存储 栈与队列:单调队列、单调栈 kmp Trie 并查集 堆 Hash表 搜索与图论 —— 代码模板链接 常用代码模板3——搜索与图论 ...

    AcWing算法基础课模板大全

    区间合并 数据结构 —— 代码模板链接 常用代码模板2——数据结构 链表与邻接表:树与图的存储 栈与队列:单调队列、单调栈 kmp Trie 并查集 堆 Hash表 搜索与图论 —— 代码模板链接 常用代码模板3——搜索与图论 ...

    不相交的闭区间的并

    区间 【问题描述】 给定n个闭区间[ai, bi](1 ),这些区间的并可以表示为一些不相交的闭区间的并。要求在这些表示方式中找出包含不相交区间数目最少的方案。 【输入形式】 输入文件为当前目录下的prz.in。 ...

    区间操作练习

    允许两个操作,add(min,max)和del(min,max),一开始区间内为空,每个操作后算出区间内的集合,要求能自动合并、拆分集合。例如: 操作1:add(1,7) 区间内的集合:(1,7) 操作2:add(9,10) 区间内的集合:(1,7)、(9,10...

Global site tag (gtag.js) - Google Analytics