LeetCode 435. 无重叠区间

这道题目是在给定的集合中找到需要去掉的区间最小数量,使得剩余区间互相不重叠,题目如下:
LeetCode 435. 无重叠区间
这道题目似乎无从下手,因为找重叠的区域确实是比较麻烦的。我们可以尝试用贪心算法来解答这个问题,我们假设有集合:intervals=[[1,2],[3,5],[2,3],[3,6],[7,8],[6,7]]intervals=[[1,2],[3,5],[2,3],[3,6],[7,8],[6,7]]intervals=[[1,2],[3,5],[2,3],[3,6],[7,8],[6,7]]
我们来用这个集合为例用贪心的思想来解决这道题目:
LeetCode 435. 无重叠区间
首先,我们将这个集合里面每个元素的尾部,也就是区间的尾部进行排序操作:
LeetCode 435. 无重叠区间
然后我们标记最小的区间的结束值,记为 minEnd;然后标记此时集合中不重合区间的个数,记为 result,那么有:
LeetCode 435. 无重叠区间
然后我们遍历集合中的区间元素,我们将区间的起始值和当前的最小区间结束值 minEnd 进行比较,如果起始值比 minEnd 要小,那么就可以说明这两个区间重合了。我们这里比较第二个区间 [2,3] 中的起始值2和当前的最小结束值 minEnd = 2, 此时区间的起始值没有比 minEnd 小,那么我们更新 result 和 minEnd 分别为2和3:
LeetCode 435. 无重叠区间
同理,我们再更新一步:
LeetCode 435. 无重叠区间
这个时候来了一个区间 [3,6][3,6][3,6],起始值是3,比此时的 minEnd 小,那么我们不管这个区间,把它去掉:
LeetCode 435. 无重叠区间
再来,同样的道理,我们可以继续更新:
LeetCode 435. 无重叠区间
LeetCode 435. 无重叠区间
这个时候我们不重叠的区间就有result=5个,所以我们需要去掉的区间是[3,6][3,6][3,6],最终我们将整个集合的长度减去不重叠区间的长度就是要去掉的空间数了。逻辑清晰之后我们就可以上代码了:

class Solution(object):
    def eraseOverlapIntervals(self, intervals):
        """
        :type intervals: List[List[int]]
        :rtype: int
        """
        if not len(intervals):
            return 0
        # 以尾部将区间进行排序
        intervals.sort(key=lambda k:k[1])
        # 初始化result 和 minEnd
        minEnd = intervals[0][1]
        result = 1
        for i in range(1, len(intervals)):
        	# 比较区间头部和 minEnd,小的话就直接去掉,大于的话就不重叠,更新result 和 minEnd
            if intervals[i][0] < minEnd:
                continue
            result += 1
            minEnd = intervals[i][1]
        return len(intervals) - result

这其实也是一个贪心的思想,希望通过这个题目能够帮助大家对贪心思想有更全面的认识,谢谢。

上一篇:435. 无重叠区间


下一篇:435,剑指 Offer-对称的二叉树