力扣 leetcode 435. 無重疊區間 貪心

Stig.Huang發表於2021-01-02

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

相關文章