【区间合并】一些小思路

leetcode中有几道和数字区间合并有关的题,大致就是有交集的地方,把这几个有交集的区间合并起来。

思路如下:

先将所有区间按照开头进行排序,然后开始遍历,用目前已确定的区间的尾部 和 即将要判断的区间的头部 比较大小,

1)如果尾部>=头部,证明有交集,就去看这两个区间谁的尾部更大,取更大的尾部;

2)如果尾部<头部,证明没有交集,那么直接把这个已确定的区间放入返回结果中,然后继续判断。

以Leetcode56题为例:

# Definition for an interval.
# class Interval(object):
#     def __init__(self, s=0, e=0):
#         self.start = s
#         self.end = e

class Solution(object):
    def merge(self, intervals):
        """
        :type intervals: List[Interval]
        :rtype: List[Interval]
        """
        if len(intervals) == 0: return []
        intervals = sorted(intervals, key = lambda x: x.start)  # 根据每个小list的第一个值进行递增排序
        res = [intervals[0]]
        for n in intervals[1:]:
            if n.start <= res[-1].end: res[-1].end = max(n.end, res[-1].end)  # 第二个的开始小于res中最大区间的尾部(用-1找到)(证明两者有交集,然后尾部取这两个交集尾部的较大值)
            else: res.append(n)  # 如果第二个区间的小值比res中最大区间的尾部还大(证明没有交集)
        return res

  

转载于:https://www.cnblogs.com/Vancuicide/p/9846503.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值