区间合并一些小思路
Posted vancuicide
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了区间合并一些小思路相关的知识,希望对你有一定的参考价值。
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
以上是关于区间合并一些小思路的主要内容,如果未能解决你的问题,请参考以下文章
AtCoder abc256全题解(区间合并模板矩阵快速幂优化dp线段树……)