贪心计算无重叠的最长区间的长度,之后用总长度减去最长无重叠的长度就是答案
最长无重叠长度计算方法为:
每次取最早结束的那个区间计算,删除和它相交的去区间这样贪心计算出的长度就是最长的
def eraseOverlapIntervals(self, intervals):
"""
:type intervals: List[List[int]]
:rtype: int
"""
intervals.sort(key = lambda x :x[1])
n = len(intervals)
end = intervals[0][1]
count = 1 #注意这里从1开始因为第一个本身是不相交的
for i in range(1,n):
if intervals[i][0] >= end: #
count += 1
end = intervals[i][1]
return n - count
动态规划,dp定义为以i为终点的最长不相交区间的长度
注意是区间所以动态转移方程:
之前的所有区间里与当前区间不相交的加一再取最大的
def eraseOverlapIntervals(self, intervals):
"""
:type intervals: List[List[int]]
:rtype: int
"""
intervals.sort()
n = len(intervals)
dp = [1]*n
for i in range(n):
res = 0
for j in range(i):
if intervals[j][1] <= intervals[i][0]:
dp[i] = max(dp[i],dp[j]+1)
return n - max(dp)