码迷,mamicode.com
首页 > 其他好文 > 详细

Merge Intervals——LeetCode

时间:2015-09-11 20:34:01      阅读:135      评论:0      收藏:0      [点我收藏+]

标签:

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].

 

题目大意:给定一个组区间,实现一个函数,合并这些区间。

解题思路:首先根据start排序,然后开始循环,判断当前end和下一个的start是否有overlap,没有的话,可以输出当前这个区间,有的话把后一个的end设置为max{后一个end,当前end},循环到最后,把所有符合条件的都加到res列表里。

    public static List<Interval> merge(List<Interval> it) {
        List<Interval> res = new ArrayList<>();
        if (it == null || it.size() == 0) {
            return res;
        }
        Comparator<Interval> comp = new Comparator<Interval>() {
            @Override
            public int compare(Interval o1, Interval o2) {
                if (o1.start - o2.start != 0) {
                    return o1.start - o2.start;
                }
                return o2.end - o1.end;
            }
        };
        Collections.sort(it, comp);
        int begin = it.get(0).start;
        int end = it.get(0).end;
        for (int i = 0; i < it.size() - 1; i++) {
            if (it.get(i).end < it.get(i + 1).start) {
                res.add(new Interval(begin, it.get(i).end));
                begin = it.get(i + 1).start;
            } else {
                it.get(i + 1).end = Math.max(it.get(i).end, it.get(i + 1).end);
            }
            end = it.get(i + 1).end;

        }
        res.add(new Interval(begin, end));
        return res;
    }

 

看到别人还有更高效的方案,直接遍历源List,在上面操作,不需要new新的Interval,本来想用Java8的lambada表达式写Comparator的,但是不知道为什么在提交的时候总是TLE。

public static List<Interval> merge(List<Interval> it) {
        List<Interval> res = new ArrayList<>();
        if (it == null || it.size() == 0) {
            return res;
        }
        //这里如果用lambda表达式,会超时
    
    //Comparator<Interval> comp = (o1, o2) -> o1.start - o2.start;
        Comparator<Interval> comp = new Comparator<Interval>() {
            @Override
            public int compare(Interval o1, Interval o2) {
                return o1.start - o2.start;
            }
        };
        Collections.sort(it, comp);
        Interval curr;
        Iterator<Interval> itor = it.iterator();
        curr = itor.next();
        while (itor.hasNext()) {
            Interval tmp = itor.next();
            if (curr.end >= tmp.start) {
                curr.end = Math.max(curr.end, tmp.end);
                itor.remove();
            } else {
                curr = tmp;
            }
        }
        return res;
    }

 

Merge Intervals——LeetCode

标签:

原文地址:http://www.cnblogs.com/aboutblank/p/4801856.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!