LeetCode056 Merge Intervals

来源:互联网 发布:mac openssl devel 编辑:程序博客网 时间:2024/05/18 02:09

详细见:leetcode.com/problems/merge-intervals


Java Solution: github

package leetcode;import java.util.HashMap;import java.util.Iterator;import java.util.LinkedList;import java.util.List;import java.util.TreeSet;public class P056_MergeIntervals {/* * 14 ms * 74.70%  */static class Solution2 {List<Interval> ans = new LinkedList<Interval>();    public List<Interval> merge(List<Interval> intervals) {    if (intervals == null || intervals.size() == 0)    return ans;    HashMap<Integer, Interval> map = new HashMap<Integer, Interval>();    Iterator<Interval> it = intervals.iterator();    while (it.hasNext()) {    Interval temp = it.next();    if (! (map.containsKey(temp.start) && map.get(temp.start).end >= temp.end))    map.put(temp.start, temp);    }    int end_pre = 0;    Interval last = null;    TreeSet<Integer> set = new TreeSet<Integer>(map.keySet());    for (int start : set) {    Interval cur = map.get(start);    if (last == null) {     last = cur;     end_pre = last.end;    } else {    if (cur.start <= end_pre) {    end_pre = Math.max(end_pre, cur.end);    } else {    last.end = end_pre;    ans.add(last);    last = cur;    end_pre = Math.max(end_pre, cur.end);    }    }    }    last.end = end_pre;    ans.add(last);        return ans;    }}static class Interval {int start;int end;Interval() { start = 0; end = 0; }Interval(int s, int e) { start = s; end = e; }}}


C Solution: github

/*    url: leetcode.com/problems/merge-intervals/    AC 9ms 45.83%*/#include <stdio.h>#include <stdlib.h>typedef struct Interval si;struct Interval {    int start;    int end;};int cmp(si i, int start, int end) {    if (i.start < start) {        return -1;    } else if (i.start > start) {        return 1;    }    if (i.end > end) {        return -1;    } else if (i.end < end) {        return 1;    }    return 0;}//[i, j)int partition(si* n, int i, int j) {    int save_start = 0, save_end = 0;    j --;    save_start = n[i].start;    save_end = n[i].end;    while (i < j) {        while (i < j && cmp(n[j], save_start, save_end) >= 0) j --;        n[i].start = n[j].start;        n[i].end = n[j].end;        while (i < j && cmp(n[i], save_start, save_end) <= 0) i ++;        n[j].start = n[i].start;        n[j].end = n[i].end;    }    n[i].start = save_start;    n[i].end = save_end;    return i;}//[i, j)void quick_sort(si* n, int i, int j) {    int p = 0;    if (i + 1 < j) {        p = partition(n, i, j);        quick_sort(n, i, p);        quick_sort(n, p+1, j);    }}si* merge(si* n, int nn, int* rn) {    int s = 0, e = 0, i = 0, ai = 0;    if (nn == 0) return NULL;    quick_sort(n, 0, nn);    s = n[0].start;    e = n[0].end;    for (i = 1; i < nn; i ++) {        if (e < n[i].start) {            n[ai].start = s;            n[ai].end = e;            ai ++;            s = n[i].start;            e = n[i].end;        } else {            e = e > n[i].end ? e : n[i].end;        }    }    n[ai].start = s;    n[ai].end = e;    ai ++;    *rn = ai;    return n;}int main() {    si n[5];    int i = 0;    int rn = 0;    si* ans = NULL;    n[0].start = 15;    n[0].end = 18;    n[1].start = 8;    n[1].end = 10;    n[2].start = 2;    n[2].end = 6;    n[3].start = 1;    n[3].end = 3;    n[4].start = 100;    n[4].end = 200;    ans = merge(n, 5, &rn);    for (i = 0; i < rn; i ++) {        printf("start is %d  end is %d\r\n", n[i].start, n[i].end);    }}


Python Solution: github

#coding=utf-8'''    url: leetcode.com/problems/merge-intervals    @author:     zxwtry    @email:      zxwtry@qq.com    @date:       2017年4月11日    @details:    Solution: 142ms 12.46%'''class Interval(object):    def __init__(self, s=0, e=0):        self.start = s        self.end = e        def print_Interval(i):    for j in range(len(i)):        print("%d: %d\t%d" % (j, i[j].start, i[j].end))class Solution(object):    def merge(self, i):        """        :type i: List[Interval]        :rtype: List[Interval]        """        k, t = 0, -1        i.sort(key=lambda x: (x.start, -x.end))        while k < len(i):            if t >= i[k].start:                i[k-1].end = max(i[k].end,i[k-1].end)                t = max(t, i[k].end)                i.remove(i[k])            else:                 t = i[k].end                k += 1        return i        if __name__ == "__main__":    i0 = Interval(1,4)    i1 = Interval(0,2)    i2 = Interval(3,5)    i3 = Interval(2,3)    i4 = Interval(15,18)    i5 = Interval(1, 3)    i = [i0, i1, i2, i3, i4, i5]    i = [i0, i1, i2]    print_Interval(Solution().merge(i))


0 0