這道題目是在給定的集合中找到需要去掉的區間最小數量,使得剩餘區間互相不重疊,題目如下:
這道題目似乎無從下手,因為找重疊的區域確實是比較麻煩的。我們可以嘗試用貪心演算法來解答這個問題,我們假設有集合:int
erva
ls=[
[1,2
],[3
,5],
[2,3
],[3
,6],
[7,8
],[6
,7]]
intervals=[[1,2],[3,5],[2,3],[3,6],[7,8],[6,7]]
interv
als=
[[1,
2],[
3,5]
,[2,
3],[
3,6]
,[7,
8],[
6,7]
]我們來用這個集合為例用貪心的思想來解決這道題目:
首先,我們將這個集合裡面每個元素的尾部,也就是區間的尾部進行排序操作:
然後我們標記最小的區間的結束值,記為 minend;然後標記此時集合中不重合區間的個數,記為 result,那麼有:
然後我們遍歷集合中的區間元素,我們將區間的起始值和當前的最小區間結束值 minend 進行比較,如果起始值比 minend 要小,那麼就可以說明這兩個區間重合了。我們這裡比較第二個區間 [2,3] 中的起始值2和當前的最小結束值 minend = 2, 此時區間的起始值沒有比 minend 小,那麼我們更新 result 和 minend 分別為2和3:
同理,我們再更新一步:
這個時候來了乙個區間 [3,
6][3,6]
[3,6
],起始值是3,比此時的 minend 小,那麼我們不管這個區間,把它去掉:
再來,同樣的道理,我們可以繼續更新:
這個時候我們不重疊的區間就有result=5個,所以我們需要去掉的區間是[3,
6][3,6]
[3,6
],最終我們將整個集合的長度減去不重疊區間的長度就是要去掉的空間數了。邏輯清晰之後我們就可以上**了:
class solution(object):
def eraseoverlapintervals(self, intervals):
""":type intervals: list[list[int]]
:rtype: int
"""if not len(intervals):
return 0
# 以尾部將區間進行排序
intervals.sort(key=lambda k:k[1])
# 初始化result 和 minend
minend = intervals[0][1]
result = 1
for i in range(1, len(intervals)):
# 比較區間頭部和 minend,小的話就直接去掉,大於的話就不重疊,更新result 和 minend
if intervals[i][0] < minend:
continue
result += 1
minend = intervals[i][1]
return len(intervals) - result
這其實也是乙個貪心的思想,希望通過這個題目能夠幫助大家對貪心思想有更全面的認識,謝謝。 leetcode 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 輸出 0 解釋 你不需要...
leetcode435無重疊空間
給定乙個區間的集合,找到需要移除區間的最小數量,使剩餘區間互不重疊。注意 可以認為區間的終點總是大於它的起點。區間 1,2 和 2,3 的邊界相互 接觸 但沒有相互重疊。示例 1 輸入 1,2 2,3 3,4 1,3 輸出 1 解釋 移除 1,3 後,剩下的區間沒有重疊。示例 2 輸入 1,2 1,...
LeetCode435無重疊區間
題目 給定乙個區間的集合,找到需要移除區間的最小數量,使剩餘區間互不重疊。注意 可以認為區間的終點總是大於它的起點。區間 1,2 和 2,3 的邊界相互 接觸 但沒有相互重疊。思路 先計算最多能組成的 不重複區間個數,然後用區間總個數減去最多能組成的不重複區間的個數。在每次選擇中,選擇區間的結尾越小...