Non-overlapping Intervals - LeetCode
給一個array,裡面放很多個 [開始 結束] 的array
把重疊的踢掉,剩下的都要是不重疊的,回傳最小的剔除次數
May 25, 2024
"""
= after sorted by start =
overlap case 1:
s--e
s-----e x
s--e
overlap case 2:
s------e x
s--e
s--e
"""
class Solution:
def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:
if len(intervals) == 1:
return 0
def is_overlap(interval1, interval2):
if interval1[1] > interval2[0]:
return True
return False
count = 0
sorted_intervals = sorted(intervals, key=lambda x:x[0])
prev = sorted_intervals[0]
for i in range(1, len(sorted_intervals)):
itv = sorted_intervals[i]
if is_overlap(prev, itv):
count += 1
# if case2, update prev
if prev[1] >= itv[1]:
prev = itv
else:
prev = itv
return count
December 27, 2023
class Solution:
def eraseOverlapIntervals(self, intervals: List[List[int]]) -> int:
sorted_intervals = sorted(intervals, key=lambda x: x[0])
prev_end = sorted_intervals[0][1]
count = 0
for i in range(1, len(sorted_intervals)):
interval = sorted_intervals[i]
# 若當前的頭比上一條的尾巴還小,必須拿掉其中一條
# 拿掉兩條中,尾巴較大的那條,才能讓 count 最小
if interval[0] < prev_end:
count += 1
prev_end = min(prev_end, interval[1])
else:
prev_end = interval[1]
return count
Time: O(n log n) for sorting, O(n) for iterating, total is O(n log n)
Space: O(1)
排序
維護一個 prevEnd, 預設值:排序後的第一個的第二個值 intervals.sort[0][1]
維護一個 remove = 0