美文网首页
LintCode 156. 合并区间

LintCode 156. 合并区间

作者: 裴很淡定 | 来源:发表于2018-06-24 13:20 被阅读0次

描述
给出若干闭合区间,合并所有重叠的部分。
样例

image.png
挑战
O(n log n) 的时间和 O(1) 的额外空间。
思路1
首先将原数组按照区间起点从大到小排序,新建空数组res,依次将数组首元素弹出,同res末位元素比较,如果区间重合着将合并后的新区间替代末位元素,否则res追加该元素。
代码1
    def merge(self, intervals):
        if len(intervals) < 2: # 数组长度小于2直接返回
            return intervals
        intervals = sorted(intervals, key=lambda x: x.start) # 排序
        res = [intervals[0]]
        i = 1
        k = 0
        while i < len(intervals):
            if res[k].end >= intervals[i].start: #判断是否可以合并
                res[k] = Interval(res[k].start, res[k].end if res[k].end >= intervals[i].end else intervals[i].end)
            else:
                res.append(intervals[i])
                k += 1
            i += 1
        return res

思路2
同思路1首先对原数组进行排序,然后遍历整个数组,如果前一个元素是空值,则继续向前,如果能和前一个元素合并,则用合并结果替换前一个元素,将当前元素置空,遍历结束后只需取出数组非空部分。
代码2

    def merge(self, intervals):
        if len(intervals) < 2:
            return intervals
        intervals = sorted(intervals, key=lambda x: x.start)
        i = 1
        while i < len(intervals):
            k = i - 1
            while intervals[k] is None:
                k -= 1
            if intervals[i].start <= intervals[k].end:
                intervals[k] = Interval(intervals[k].start,
                                        intervals[k].end if intervals[k].end >= intervals[i].end else intervals[i].end)
                intervals[i] = None
            i += 1
        return filter(lambda x: x is not None, intervals)

思路3
不对数组进行排序,直接遍历并将向前逐个合并,若能合并则记录下标及合并值,到达数组开始位置跳出循环,并将记录下标位置设置为合并值,最终将数组去空后排序。
代码3

    def combin(self, a, b):
        return Interval(a.start if a.start < b.start else b.start, a.end if a.end > b.end else b.end)
    def judge(self,a,b):
        if a.start < b.start:
            return a.end >= b.start
        else:
            return b.end >= a.start
    def merge(self, intervals):
        if len(intervals) < 2:
            return intervals
        i = 1
        while i < len(intervals):# 向后遍历
            j = i#标志位
            tmp = intervals[j] #缓存合并区间
            intervals[j] = None
            k = j - 1
            while k >= 0:# 向前遍历
                if intervals[k] is None:
                    k -= 1
                    continue
                if self.judge(tmp,intervals[k]):# 判断能否合并
                    tmp = self.combin(intervals[k], tmp) #更新缓存
                    intervals[k] = None # 置空
                    j = k #更新标志位
                k -= 1
            intervals[j] = tmp
            i += 1
        return sorted(filter(lambda x: x is not None, intervals),key=lambda x: x.start)

结语
感觉只用思路3是符合挑战要求的,但提交的时候竟然超时了23333

相关文章

  • LintCode 156. 合并区间

    描述给出若干闭合区间,合并所有重叠的部分。样例 思路2同思路1首先对原数组进行排序,然后遍历整个数组,如果前一个元...

  • 156. 合并区间

    给出若干闭合区间,合并所有重叠的部分。样例给出的区间列表 => 合并后的区间列表: 先排序再处理 这个问题如果按照...

  • LintCode 156-合并区间

    分析 注意细节处理就好

  • LeetCode&Python 156.合并区间

    描述 给出若干闭合区间,合并所有重叠的部分。 样例 Given intervals => merged inter...

  • 区间合并算法

    0X00 区间合并 803. 区间合并 57. 插入区间

  • LeetCode 56 [Merge Intervals]

    原题 给出若干闭合区间,合并所有重叠的部分。 样例给出的区间列表 => 合并后的区间列表: 解题思路 首先,把区间...

  • 2018-12-26

    问题列表 合并两个有序链表 合并K个排序链表 合并区间 插入区间 问题与反馈 总结与收获 多个有序链表的合并,类似...

  • lintcode 搜索区间

    给定一个包含 n 个整数的排序数组,找出给定目标值 target 的起始和结束位置。如果目标值不在数组中,则返回[...

  • 命令lines

    HBQJ 【合并区间】可以选取两个相邻的尺寸区间进行合并,也可以选择间隔几个区间的两个区间以将两个区间及其中间的所...

  • LeetCode 56 合并区间

    56. 合并区间 给出一个区间的集合,请合并所有重叠的区间。 示例 1: 输入: [[1,3],[2,6],[8,...

网友评论

      本文标题:LintCode 156. 合并区间

      本文链接:https://www.haomeiwen.com/subject/zbqdyftx.html