边工作边刷题:70天一遍leetcode: day 41-3

Data Stream as Disjoint Intervals

要点:因为data stream处理中任何中间结果interval之间都是disjoint的,所以可以直接用binary search tree(而不需要Interval tree)。BST是按interval start存储。

  • merge的方式:类似Insert Interval,但是更容易点。先和floor.end比较,然后变换插入Interval的start,然后比较higher.start,变换Interval的end。中间不插入会提前return。

错误点:

要点:上面的方法是在addNum时候merge,也可以在getIntervals的时候做。也就是说,addNum只是插入(val, val),可以用一个heap保持按start的顺序插入。然后就类似于merge intervals了,主要是可以merge的情况不pop,而更新heap顶interval.end。唯一差别就是+1也要merge。还有一个注意点,这题是stream,所以要save heap的元素,巧妙的方法是把输出赋值heap,因为输出还是维持start顺序的,和heap是一样的。只是merge了,再利用python heapq是在list上操作的。
错误点:

  • heap是不能接受Interval object的,并且tuple是immutable的,所以要用list[list]表示heap中的interval,否则,TypeError: 'tuple' object does not support item assignment
# Definition for an interval.
# class Interval(object):
#     def __init__(self, s=0, e=0):
#         self.start = s
#         self.end = e

from heapq import *

class SummaryRanges(object):

    def __init__(self):
        """
        Initialize your data structure here.
        """
        self.intervals = []
        self.res = []

    def addNum(self, val):
        """
        :type val: int
        :rtype: void
        """
        heappush(self.intervals, [val, val])

    def getIntervals(self):
        """
        :rtype: List[Interval]
        """
        res = []
        while self.intervals:
            top = heappop(self.intervals)
            if res and top[0]<=res[-1][1]+1:
                res[-1][1]=max(res[-1][1], top[1]) # error 2: TypeError: 'tuple' object does not support item assignment
            else:
                res.append([top[0], top[1]])
        
        self.intervals = res
        return [Interval(i[0], i[1]) for i in res]


# Your SummaryRanges object will be instantiated and called as such:
# obj = SummaryRanges()
# obj.addNum(val)
# param_2 = obj.getIntervals()
原文地址:https://www.cnblogs.com/absolute/p/5690297.html