[435][中等][贪心][动态规划] 无重叠区间
问题描述
输入: [ [1,2], [2,3], [3,4], [1,3] ]
输出: 1
解释: 移除 [1,3] 后,剩下的区间没有重叠。输入: [ [1,2], [1,2], [1,2] ]
输出: 2
解释: 你需要移除两个 [1,2] 来使剩下的区间没有重叠。解题思路
动态规划
贪心
最后更新于
输入: [ [1,2], [2,3], [3,4], [1,3] ]
输出: 1
解释: 移除 [1,3] 后,剩下的区间没有重叠。输入: [ [1,2], [1,2], [1,2] ]
输出: 2
解释: 你需要移除两个 [1,2] 来使剩下的区间没有重叠。最后更新于
输入: [ [1,2], [2,3] ]
输出: 0
解释: 你不需要移除任何区间,因为它们已经是无重叠的了。class Solution:
def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:
n = len(intervals)
if n == 0:
return 0
intervals.sort()
dp = [1] * n
max_len = 1
for j in range(n):
for i in range(j):
if intervals[j][0] >= intervals[i][1] and dp[i] >= dp[j]:
dp[j] = dp[i] + 1
max_len = max(max_len, dp[j])
return n - max_len 【————】 i区间, 记为A
【————】 i+1区间的一种可能, 记为B, 与区间A部分重叠
【————————————————】 i+1区间的另一种可能, 记为C, 完全涵盖A区间class Solution:
def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:
n = len(intervals)
if n == 0:
return 0
intervals.sort(key=lambda x: x[1])
length = []
for left, right in intervals:
if len(length) == 0 or left >= length[-1]:
length.append(right)
return n - len(length)