貪心演算法 力扣435 無重疊區間

2022-10-09 10:39:09 字數 1926 閱讀 5924

給定乙個區間的集合 intervals ,其中 intervals[i] = [starti, endi] 。返回 需要移除區間的最小數量,使剩餘區間互不重疊 。

示例:

輸入: intervals = [[1,2],[2,3],[3,4],[1,3]]

輸出: 1

解釋: 移除 [1,3] 後,剩下的區間沒有重疊。

思路1:貪心演算法在選擇要保留區間時,區間的結尾十分重要:選擇的區間結尾越小,餘留給其它區間的空間就越大,就越能保留更多的區間。因此採取的貪心策略為:優先保留結尾小且不相交的區間

具體實現方法:先把區間按照結尾的大小進行增序排序,每次選擇結尾最小和前乙個選擇的區間不重疊的區間。

注意:需要根據實際情況判斷按區間開頭排序還是按區間結尾排序

區間a是最先開始的,如果我們採用區間a作為放入最大不重疊區間的首個區間,那麼後面我們只能採用區間d作為第二個放入最大不重疊區間的區間,但這樣的話,最大不重疊區間的數量為2。但是如果我們採用區間b作為放入最大不重疊區間的首個區間,那麼最大不重疊區間的數量為3,因為區間b是最先結束的。

class solution:

def eraseoverlapintervals(self, intervals: list[list[int]]) -> int:

n = len(intervals)

if not intervals:

# if n == 0:

return 0

intervals.sort(key=lambda x: x[1]) # 根據物件中的第二維資料的值進行公升序

right = intervals[0][1] # 從第乙個區間的右端點開始進行比較

ans = 1 # 留下來的區間數,初始化為 1

for i in range(1, n):

# 後面區間的左端點依次與前面的右端點比較

if intervals[i][0] >= right:

ans += 1

right = intervals[i][1]

return n - ans

時間複雜度:o(nlogn),其中 n 是區間的數量。我們需要 o(nlogn) 的時間對所有的區間按照右端點進行公升序排序,並且需要 o(n) 的時間進行遍歷。由於前者在漸進意義下大於後者,因此總時間複雜度為 o(nlogn)。

空間複雜度:o(logn),即為排序需要使用的棧空間。

思路2:動態規劃

題目的要求等價於「選出最多數量的區間,使得它們互不重疊」。由於選出的區間互不重疊,因此我們可以將它們按照端點從小到大的順序進行排序,並且無論我們按照左端點還是右端點進行排序,得到的結果都是唯一的。

由於該方法的時間複雜度較高,因此在下面的**中,盡量使用列表推導優化常數,使得其可以在時間限制內通過所有測試資料。

class solution:

def eraseoverlapintervals(self, intervals: list[list[int]]) -> int:

if not intervals:

return 0

intervals.sort()

n = len(intervals)

f = [1]

for i in range(1, n):

return n - max(f)

435 無重疊區間(貪心演算法)

給定乙個區間的集合,找到需要移除區間的最小數量,使剩餘區間互不重疊。注意 可以認為區間的終點總是大於它的起點。區間 1,2 和 2,3 的邊界相互 接觸 但沒有相互重疊。示例 1 輸入 1,2 2,3 3,4 1,3 輸出 1 解釋 移除 1,3 後,剩下的區間沒有重疊。示例 2 輸入 1,2 1,...

貪心演算法 leetcode 435 無重疊區間

include include include include include include using namespace std 貪心演算法 可以認為是動態規劃的乙個特例,相比於動態規劃,使用貪心演算法需要滿足更多的條件,但是效率更高 貪心演算法的條件 每一步都做乙個區域性最優解的選擇,最終的...

力扣 中等 435 無重疊區間

給定乙個區間的集合,找到需要移除區間的最小數量,使剩餘區間互不重疊。注意 可以認為區間的終點總是大於它的起點。區間 1,2 和 2,3 的邊界相互 接觸 但沒有相互重疊。示例 1 輸入 1,2 2,3 3,4 1,3 輸出 1 解釋 移除 1,3 後,剩下的區間沒有重疊。示例 2 輸入 1,2 1,...