leetcode 56 合并区间, 57 插入区间

本文介绍了LeetCode第56题“合并区间”及第57题“插入区间”的解决方案。通过对区间进行排序并合并重叠部分,实现了区间集合的有效管理和更新。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

每天坚持刷题!!!

leetcode 56 合并区间

题目描述:
给出一个区间的集合,请合并所有重叠的区间。

题目分析:
1. 先简单分析下合并的过程。假设Interval_x 和 Interval_y合并,那么合并的结果就是 Interval(min(Interval_x.start, Interval_y.start), max(Interval_x.end, Interval_y.end))
2. 这道题的难点在于可能会有多个区间合并成一个区间,并且这些区间的位置并不连续。为了回避这个问题,我们可以先把给定的区间集合根据其起点来进行排序,不断从头尝试合并区间,直到下一个元素的起点比之前的区间(或是合并后的区间)的终点还要大就认为之前的合并过程结束,开始下一个区间的合并,直到最后一个区间。

def merge(self, intervals):
        """
        :type intervals: List[Interval]
        :rtype: List[Interval]
        """
        if not intervals:
            return []
        if len(intervals) == 1:
            return [[intervals[0].start, intervals[0].end]]
        intervals = sorted(intervals, key=lambda x: x.start, reverse=False)
        result = []
        temp_start, temp_end = None, None
        for i in xrange(len(intervals)):
            if temp_start is None:
                temp_start = intervals[i].start
                temp_end = intervals[i].end
            if intervals[i].start > temp_end:
                result.append(Interval(temp_start, temp_end))
                temp_start = intervals[i].start
                temp_end = intervals[i].end
            else:
                temp_start = min(temp_start, intervals[i].start)
                temp_end = max(temp_end, intervals[i].end)
        if temp_start is not None:
            result.append(Interval(temp_start, temp_end))
        return result

leetcode 57 插入区间
这道题跟56实在是太像了,就一起解决了

题目描述:
给出一个无重叠的 ,按照区间起始端点排序的区间列表。
在列表中插入一个新的区间,你需要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。

题目分析:
1. 这道题给出的区间集合就已经按照起点排好序了,good,省了一行代码
2. 所谓的插入可以简单的看成增加一个额外的区间后在进行合并,所以这里偷懒直接使用56的代码。当然为了效率可以使用二分查找找到对应的插入位置(因为已经按照起点排好序了),然后在对后面的元素进行合并操作直到无法合并即可。

def insert(self, intervals, newInterval):
        """
        :type intervals: List[Interval]
        :type newInterval: Interval
        :rtype: List[Interval]
        """
        if not intervals and not newInterval:
            return []
        elif not intervals:
            return [newInterval]
        elif not newInterval:
            return intervals
        intervals.append(newInterval)
        intervals = sorted(intervals, key=lambda x: x.start, reverse=False)
        result = []
        temp_start, temp_end = None, None
        for i in xrange(len(intervals)):
            if temp_start is None:
                temp_start = intervals[i].start
                temp_end = intervals[i].end
            if intervals[i].start > temp_end:
                result.append(Interval(temp_start, temp_end))
                temp_start = intervals[i].start
                temp_end = intervals[i].end
            else:
                temp_start = min(temp_start, intervals[i].start)
                temp_end = max(temp_end, intervals[i].end)
        if temp_start is not None:
            result.append(Interval(temp_start, temp_end))
        return result
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值