https://leetcode-cn.com/problems/merge-intervals/

# -*- coding:utf-8 -*-

class Solution(object):
    def merge(self, intervals):
        """
        :type intervals: List[List[int]]
        :rtype: List[List[int]]
        """
        def cmp(x, y):
            if x[0] > y[0]:
                return 1
            elif x[0] < y[0]:
                return -1
            else:
                return 0
        if len(intervals) == 1:
            return intervals
        import functools
        intervals = sorted(intervals, key=functools.cmp_to_key(cmp))
        do_length = 0
        do_idx = 1
        max_length = len(intervals)
        while do_length < max_length - 1:
            if intervals[do_idx][0] <= intervals[do_idx - 1][1]:
                intervals[do_idx - 1][1] = max(intervals[do_idx][1], intervals[do_idx - 1][1])
                intervals.remove(intervals[do_idx])
            else:
                do_idx += 1
            do_length += 1
        return intervals
if __name__ == '__main__':
    intervals = [[1, 3], [2, 6], [8, 10], [15, 18]]
    intervals = [[1, 3], [5, 6]]
    # intervals = [[1, 4], [0, 2], [3, 5]]
    print(Solution().merge(intervals))

思路:首先是排序,然后根据当前的0号位是否小于前一个的1号位来判断这两个是否可以合并,如果可以就合并。

这里了解了python的自定义比较函数,还必须导入一个funtools。。学到了学到了。

插入区间只要在上面代码上做一些微小的改动,将newInterval插入intervals然后改一下边界条件即可。

# -*- coding:utf-8 -*-

class Solution(object):
    def insert(self, intervals, newInterval):
        """
        :type intervals: List[List[int]]
        :type newInterval: List[int]
        :rtype: List[List[int]]
        """
        def cmp(x, y):
            if x[0] > y[0]:
                return 1
            elif x[0] < y[0]:
                return -1
            else:
                return 0
        if len(intervals) == 0:
            return [newInterval]
        import functools
        intervals.append(newInterval)
        intervals = sorted(intervals, key=functools.cmp_to_key(cmp))
        do_length = 0
        do_idx = 1
        max_length = len(intervals)
        while do_length < max_length - 1:
            if intervals[do_idx][0] <= intervals[do_idx - 1][1]:
                intervals[do_idx - 1][1] = max(intervals[do_idx][1], intervals[do_idx - 1][1])
                intervals.remove(intervals[do_idx])
            else:
                do_idx += 1
            do_length += 1
        return intervals
if __name__ == '__main__':
    intervals = []
    newInterval = [5, 7]
    print(Solution().insert(intervals, newInterval))
分类: 算法

0 条评论

发表回复

Avatar placeholder

您的电子邮箱地址不会被公开。