Merge Intervals

Given an array of intervals where intervals[i] = [starti, endi], merge all overlapping intervals, and return an array of the non-overlapping intervals that cover all the intervals in the input.

Solution

  • submit code
class Solution:
    def merge(self, intervals: List[List[int]]) -> List[List[int]]:

        if len(intervals) == 1:
            return [intervals[0]]

        ret = []

        # 按第一个元素排序
        intervals.sort(key=self.merge_sort)

        # 相同起点,按终点降序
        for X in range(1,len(intervals)):
            if intervals[X][0] == intervals[X-1][0] and intervals[X][1] < intervals[X-1][1]:
                intervals[X-1][1],intervals[X][1] = intervals[X][1],intervals[X-1][1]


        left = intervals[0][0]
        right = intervals[0][1]
        for i in range(1,len(intervals)):
            # 相交区间合并
            if intervals[i][0] <= right and intervals[i][1] >= right:
                right = intervals[i][1]
            # 单独的/不相交区间,不合并
            elif intervals[i][0] > right:
                ret.append([left,right])
                left = intervals[i][0]
                right = intervals[i][1]
            # 末尾数取值
            if i == len(intervals)-1:
                ret.append([left,right])

        return ret

    def merge_sort(self, elem):
        return elem[0]
  • full code
class Solution:
    def merge(self, intervals):

        if len(intervals) == 1:
            return [intervals[0]]

        ret = []

        # 按第一个元素排序
        intervals.sort(key=self.merge_sort)

        # 相同起点,按终点降序
        for X in range(1,len(intervals)):
            if intervals[X][0] == intervals[X-1][0] and intervals[X][1] < intervals[X-1][1]:
                intervals[X-1][1],intervals[X][1] = intervals[X][1],intervals[X-1][1]

        print(intervals)

        left = intervals[0][0]
        right = intervals[0][1]
        print(len(intervals))
        for i in range(1,len(intervals)):
            print("i:",i,"left:",left,"right:",right,"intervals[i][0]",intervals[i][0],"intervals[i][1]",intervals[i][1])
            # 相交区间合并
            if intervals[i][0] <= right and intervals[i][1] >= right:
                right = intervals[i][1]
            # 单独的/不相交区间,不合并
            elif intervals[i][0] > right:
                ret.append([left,right])
                left = intervals[i][0]
                right = intervals[i][1]
            # 末尾数取值
            if i == len(intervals)-1:
                ret.append([left,right])
            print((left,right))

        return ret

    def merge_sort(self, elem):
        return elem[0]


S = Solution()
# print(S.merge([[1,3],[2,6],[2,3],[8,10],[15,18],[17,20]]))
# print(S.merge([[1,4],[4,5]]))
# print(S.merge([[1,3],[2,6],[8,10],[15,18]]))
# print(S.merge([[1,4],[0,4]]))
# print(S.merge([[1,4]]))
print(S.merge([[1,4],[2,3]]))

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *