leetcode每日一題 435 無重疊區間

2021-10-13 13:00:48 字數 1157 閱讀 2023

題目:

給定乙個區間的集合,找到需要移除區間的最小數量,使剩餘區間互不重疊。

注意:可以認為區間的終點總是大於它的起點。

區間 [1,2] 和 [2,3] 的邊界相互「接觸」,但沒有相互重疊。

思路:

貪心演算法:

將所有區間按右端點進行排序,並將第乙個區間作為符合條件的初始區間,並記其右端點為right,則按序查詢首個 左端點大於等於right的區間,令其為第二個區間。依次類推,直到所有區間遍歷完畢。

證明:最優子結構

若存在兩個區間,區間i [li,ri] 和區間j [lj,rj]。設區間j是首個(最左側)區間,左側沒有不重疊的區間,右側有若干個不重疊的區間。若存在乙個區間i,其右側端點值ri 小於 區間j的右側端點值rj,則將區間j換位區間i,仍然滿足條件。所以我們可以得到,首個區間就是所有可以選擇的區間中右端點最小的那個區間。當確定了首個區間之後,所有與首個區間不重合的區間就組成了乙個規模更小的子問題。

解答:

class

solution

:def

eraseoverlapintervals

(self, intervals: list[list[

int]])

->

int:

ifnot intervals:

return

0#將所有區間按右端點進行排序

intervals.sort(key=

lambda x: x[1]

) n =

len(intervals)

right = intervals[0]

[1] ans =

1for i in

range(1

, n)

:if intervals[i][0

]>= right:

ans +=

1 right = intervals[i][1

]return n - ans

每日一題 LeetCode

在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。示例 1 輸入 7,5,6,4 輸出 5 限制 0 陣列長度 50000 思想是 分治演算法 所有的 逆序對 於 3 個部分 左邊區間的逆序對 右邊區間的逆序對 橫跨兩個區間的...

LeetCode每日一題(題1028)

最近在刷leetcode每日一題,每次做完之後總能有些收穫,所以想著不如每天寫個部落格記錄一下做的題目的解法以及自己寫的時候問題出在 從先序遍歷還原二叉樹 題目大意 給出乙個字串 1 2 3 4 5 6 7 1代表節點的值,前面的 個數代表節點的深度。如果只有乙個子節點,保證這個節點為左子節點。返回...

LeetCode每日一題(題139)

題目 題目大意 給出乙個字串s和乙個字串陣列words,判斷s是否能夠拆分成多個words中的字串。分析 這道題比較簡單的方式應該是採用動態規劃來做。對於任意乙個字串中的區間,可以判斷該區間組成的字串是否在字典中,如果是,則這個區間的真假取決於前面那個區間的真假。給出狀態轉移方程dp i dp j ...