贪心算法

435. 无重叠区间

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

注意:

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

输入: [ [1,2], [2,3], [3,4], [1,3] ]

输出: 1

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

思路1: 动态规划:这个题和最长上升子序列很类似。我们先将数组按照每个区间的起点进行排序。然后按照最长上升子序列思路即可。

class Solution:
    def eraseOverlapIntervals(self, intervals) -> int:
        if len(intervals)<=1: return 0
        intervals = sorted(intervals, key = lambda x: x[0])
        dp = [1]*len(intervals)
        for i in range(1,len(intervals)):
            for j in range(i):
                if intervals[i][0]>=intervals[j][1]:
                    dp[i] = max(dp[i], dp[j]+1)
        return len(intervals)-max(dp)
View Code

思路2: 贪心算法: 这次将每个区间的终点进行从小到大排序。每次寻找结尾最早,并且和前面不重叠的区间。

先计算能组成不重叠最多区间个数: (1)按区间结尾排序 (2)每次选择结尾最小,且与前一个区间不重叠

 

class Solution:
    def eraseOverlapIntervals(self, intervals) -> int:
        if not intervals:
            return 0
        intervals = sorted(intervals, key=lambda x:x[1])
        curr, count = 0, 1
        for i in range(1, len(intervals)):
            if intervals[i][0]>=intervals[curr][1]:
                count+=1
                curr = i
        return len(intervals)-count

 

posted @ 2019-08-05 18:00  三年一梦  阅读(182)  评论(0)    收藏  举报