贪心算法
给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。
注意:
可以认为区间的终点总是大于它的起点。
区间 [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)
思路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

浙公网安备 33010602011771号