前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[Leetcode][python]Insert Interval/插入区间

[Leetcode][python]Insert Interval/插入区间

作者头像
蛮三刀酱
发布2019-03-26 16:05:31
5980
发布2019-03-26 16:05:31
举报

题目大意

给出多个不重合的数据区段,现在插入一个数据区段,有重合的区段要进行合并。

注意点: 所给的区段已经按照起始位置进行排序

解题思路

来自:https://shenjie1993.gitbooks.io/leetcode-python/057%20Insert%20Interval.html 最简单的方式就是复用 Merge Intervals 的方法,只需先将新的数据区段加入集合即可,但这样效率不高。既然原来的数据段是有序且不重合的,那么我们只需要找到哪些数据段与新的数据段重合,把这些数据段合并,并加上它左右的数据段即可。

代码

复用Merge Intervals

代码语言:javascript
复制
class Solution(object):
    def insert(self, intervals, newInterval):
        """
        :type intervals: List[Interval]
        :type newInterval: Interval
        :rtype: List[Interval]
        """
        result = []
        if not intervals:
            return [newInterval]
        intervals.append(newInterval)
        intervals.sort(key = lambda x: x.start)
        result.append(intervals[0])
        for interval in intervals[1:]:
            prev = result[-1]
            if prev.end >= interval.start:
                prev.end = max(prev.end, interval.end)
            else:
                result.append(interval)
        return result

独立解法(效率较高)

代码语言:javascript
复制
# Definition for an interval.
# class Interval(object):
#     def __init__(self, s=0, e=0):
#         self.start = s
#         self.end = e

class Solution(object):
    def insert(self, intervals, newInterval):
        """
        :type intervals: List[Interval]
        :type newInterval: Interval
        :rtype: List[Interval]
        """
        start, end = newInterval.start, newInterval.end
        left = list(filter(lambda x: x.end < start, intervals))
        right = list(filter(lambda x: x.start > end, intervals))
        print left, right
        if len(left) + len(right) != len(intervals):  # 如果左边和右边的数量相加不等于原数量,说明新区间与某个老区间有交叉,则需要合并
            start = min(start, intervals[len(left)].start)  # len(left)是分开后左边区间的后面一个
            end = max(end, intervals[-len(right) - 1].end)  # -len(right) - 1是分开后右边区间的前面一个

        return left + [Interval(start, end)] + right  # Interval是区间类,新建一个区间类

总结

关于filter,list(filter(lambda x: x.end < start, intervals)),请看: http://blog.csdn.net/shark0001/article/details/1363564

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年10月12日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目大意
  • 解题思路
  • 代码
    • 复用Merge Intervals
      • 独立解法(效率较高)
      • 总结
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档