Given a collection of intervals, merge all overlapping intervals.

For example,
Given [1,3],[2,6],[8,10],[15,18],
return [1,6],[8,10],[15,18].

解题思路一:

用两个指针startIndex和endIndex来维护每次添加intervals的start和end的位置,然后分类讨论即可,JAVA实现如下:

public List<Interval> merge(List<Interval> intervals) {
List<Interval> list = new ArrayList<Interval>();
if (intervals.size() == 0)
return list;
list.add(intervals.get(0));
for (int i = 1; i < intervals.size(); i++) {
Interval temp = intervals.get(i);
int startIndex = 0, endIndex = 0;
for (int j = 0; j < list.size(); j++) {
if (temp.start > list.get(j).end) {
startIndex += 2;
endIndex += 2;
continue;
}
if (temp.end < list.get(j).start)
break;
if (temp.start >= list.get(j).start)
startIndex++;
if (temp.end > list.get(j).end) {
endIndex += 2;
continue;
}
if (temp.end >= list.get(j).start)
endIndex++;
break;
}
if(startIndex==endIndex&&startIndex%2==0)
list.add(startIndex/2,new Interval(temp.start,temp.end));
else if(startIndex%2==0&&endIndex%2==0){
list.get(startIndex/2).start=temp.start;
list.get(startIndex/2).end=temp.end;
for(int k=1;k<endIndex/2-startIndex/2;k++)
list.remove(startIndex/2+1);
}
else if(startIndex%2==0&&endIndex%2!=0){
list.get(startIndex/2).start=temp.start;
list.get(startIndex/2).end=list.get(endIndex/2).end;
for(int k=1;k<=endIndex/2-startIndex/2;k++)
list.remove(startIndex/2+1);
}
else if(startIndex%2!=0&&endIndex%2==0){
list.get(startIndex/2).end=temp.end;
for(int k=1;k<endIndex/2-startIndex/2;k++)
list.remove(startIndex/2+1);
}
else if(startIndex%2!=0&&endIndex%2!=0){
list.get(startIndex/2).end=list.get(endIndex/2).end;
for(int k=1;k<=endIndex/2-startIndex/2;k++)
list.remove(startIndex/2+1);
}
}
return list;
}

解题思路二:

首先构造一个比较器,对interval按照start进行排序,然后进行遍历,在遍历过程中,如果结果集合为空或者当前interval与结果集合中的最后一个interval不重叠,那么就直接将当前interval直接加入到结果集合中;如果发生了重叠,那么将结果集合的最后一个interval的右端点改为当前interval的右端点,JAVA实现如下:

	public List<Interval> merge(List<Interval> intervals) {
List<Interval> list = new ArrayList<Interval>();
Comparator<Interval> comparator = new Comparator<Interval>() {
@Override
public int compare(Interval o1, Interval o2) {
if (o1.start == o2.start)
return o1.end - o2.end;
return o1.start - o2.start;
}
};
Collections.sort(intervals, comparator);
for (Interval interval : intervals)
if (list.size() == 0 || list.get(list.size() - 1).end < interval.start)
list.add(new Interval(interval.start, interval.end));
else
list.get(list.size() - 1).end = Math.max(interval.end, list.get(list.size() - 1).end);
return list;
}

Java for LeetCode 056 Merge Intervals的更多相关文章

  1. Java for LeetCode 023 Merge k Sorted Lists

    Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 解 ...

  2. [Leetcode Week2]Merge Intervals

    Merge Intervals题解 原创文章,拒绝转载 题目来源:https://leetcode.com/problems/merge-intervals/description/ Descript ...

  3. 【LeetCode】Merge Intervals 题解 利用Comparator进行排序

    题目链接Merge Intervals /** * Definition for an interval. * public class Interval { * int start; * int e ...

  4. 【leetcode】Merge Intervals

    Merge Intervals Given a collection of intervals, merge all overlapping intervals. For example,Given  ...

  5. 【leetcode】Merge Intervals(hard)

    Given a collection of intervals, merge all overlapping intervals. For example,Given [1,3],[2,6],[8,1 ...

  6. 【leetcode】 Merge Intervals

    Merge Intervals Given a collection of intervals, merge all overlapping intervals. For example,Given  ...

  7. leetcode 56. Merge Intervals 、57. Insert Interval

    56. Merge Intervals是一个无序的,需要将整体合并:57. Insert Interval是一个本身有序的且已经合并好的,需要将新的插入进这个已经合并好的然后合并成新的. 56. Me ...

  8. LeetCode 56. Merge Intervals 合并区间 (C++/Java)

    题目: Given a collection of intervals, merge all overlapping intervals. Example 1: Input: [[1,3],[2,6] ...

  9. LeetCode 56. Merge Intervals (合并区间)

    Given a collection of intervals, merge all overlapping intervals. For example,Given [1,3],[2,6],[8,1 ...

随机推荐

  1. BZOJ-1001 狼抓兔子 (最小割-最大流)平面图转对偶图+SPFA

    1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MB Submit: 14686 Solved: 3513 [Submit][ ...

  2. dijkstra,SPFA,Floyd求最短路

    Dijkstra: 裸的算法,O(n^2),使用邻接矩阵: 算法思想: 定义两个集合,一开始集合1只有一个源点,集合2有剩下的点. STEP1:在集合2中找一个到源点距离最近的顶点k:min{d[k] ...

  3. Uva11300 Spreading the Wealth

    设第i个人需要给第i+1个人的金币数为xi(xi为负代表收到钱),列出一大堆方程. 设第i个人给第i-1个人的钱为xi(xi<0表示第i-1个人给第i个人钱).计算出最后每个人应该有的钱m,解方 ...

  4. android studio中the logging tag can be most 23 characters

    转:http://blog.csdn.net/voiceofnet/article/details/49866047 今天写代码的时候,突然发现平时用的好好的Log竟然报错,提示信息为:the log ...

  5. linux(Debian)下安装与MySql的安装、卸载、配置及使用

    参考资料:http://www.cnblogs.com/xusir/p/3334217.html 以下是简要记录. 一.安装 安装:apt-get install mysql-server mysql ...

  6. Swift定义单例

    而在Swift中我们通过清晰的语法便能定义类变量: 通过static定义的类变量无法在子类重写,通过class定义的类变量则可在子类重写. struct SomeStructure { static ...

  7. afasf

    http://www.cnblogs.com/ttzhang/archive/2008/11/02/1324601.html project server 2007 sn :W2JJW-4KYDP-2 ...

  8. springmvc中@PathVariable和@RequestParam的区别(百度收集)

    http://localhost:8080/Springmvc/user/page.do?pageSize=3&pageNow=2 你可以把这地址分开理解,其中问号前半部分:http://lo ...

  9. C# Socket大文件上传

    public sealed class SocketData { private SocketData() { } public static SendFileMode SendFile(Socket ...

  10. SQL里的EXISTS与in、not exists与not in

    系统要求进行SQL优化,对效率比较低的SQL进行优化,使其运行效率更高,其中要求对SQL中的部分in/not in修改为exists/not exists 修改方法如下: in的SQL语句 SELEC ...