力扣 leetcode 435. 无重叠区间 贪心

Topic:

给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。

注意:

可以认为区间的终点总是大于它的起点。
区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。

Example 1:

输入: [ [1,2], [2,3], [3,4], [1,3] ]
输出: 1
解释: 移除 [1,3] 后,剩下的区间没有重叠。

Example 2:

输入: [ [1,2], [1,2], [1,2] ]
输出: 2
解释: 你需要移除两个 [1,2] 来使剩下的区间没有重叠。

Example 3:

输入: [ [1,2], [2,3] ]
输出: 0
解释: 你不需要移除任何区间,因为它们已经是无重叠的了。

思路:
首先按照区间右侧端点值进行排序
(按照左侧区间排序思路类似,但需要增加许多判断)
之后从右端点第二小的区间开始
如果右端点第二小的区间左侧端点仍然比最小右端点区间的左侧端点小
则需要删除此区间,需要删除的区间数res += 1
若发现左侧端点比最小右区间的右端点大或相等
则将新的区间右端点设置为新的整体右区间端点
依次类推,直至遍历完所有

此题贪心算法思路与leetcode 452. 用最少数量的箭引爆气球 及其相似,可供参考

452题题解链接

Code:

class Solution:
    def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:
        intervals.sort(key=lambda x: x[1])
        res = 0
        
        if len(intervals) == 0:
            return 0
        
        i = 1
        a = 0
        while i < len(intervals):
            if intervals[a][1] > intervals[i][0]:
                res += 1
                i += 1
            else:
                a = i
                i += 1

        return res
上一篇:435,剑指 Offer-对称的二叉树


下一篇:435. 无重叠区间