LeetCode435 無重疊區間

2022-06-07 14:12:09 字數 1985 閱讀 7810

方法1:動態規劃。類似於最長上公升子串行問題。 時間複雜度為o(n^2), 空間複雜度:o(n)

先將所有的 n 個區間按照左端點從小到大進行排序,隨後使用動態規劃的方法求出區間數量的最大值。

☆☆☆☆方法2【最優解】:貪心演算法。時間複雜度:o(nlogn), 空間複雜度:o(logn)

每次選擇中,前乙個區間的結尾越小,後面越有可能容納更多區間。

兩種思路,可以對區間尾進行排序,也可以對區間頭排序。

**1:

class

solution

//對每個區間排序,以區間頭的大小為參考

new comparator()

//});

arrays.sort(intervals, (o1, o2) -> o1[0] - o2[0]);

//狀態的定義: dp[i]表示 從區間0開始,以區間i為最後乙個區間,可以選出的區間數量的最大值。

//初始化:把區間i單獨拿出來就是1個互不重疊的區間,因此初始化為1

int dp = new

int[intervals.length];

arrays.fill(dp, 1);

int res = 1;

for (int i = 1; i < intervals.length; i++)

}res = math.max(res, dp[i]); //

所有dp[i]裡取最大的

}

return intervals.length -res;}}

**2:

class

solution

/*** 方法1:按照區間頭來排序,記錄移除的次數

* 如果遇到覆蓋,那麼就需要刪除乙個區間,因為需要盡可能不與後面的區間產生重疊,

* 應該讓現有區間越短越好,因此需要移除尾部較大的,保留區間結尾較小的。

*/arrays.sort(intervals, (o1, o2) -> o1[0] - o2[0]);

int count = 0; //

移除的次數

int pre = 0; //

前乙個區間的索引

for (int i = 1; i < intervals.length; i++)

else

}return

count;

/*** 方法2:按照區間尾來排序,記錄選擇區間的個數

* 每次選擇結尾最早的,且和前乙個區間不重疊的區間

*//*

arrays.sort(intervals, (o1, o2) -> o1[1] - o2[1]);

int res = 1; // 選擇區間的個數

int pre = 0;

for (int i = 1; i < intervals.length; i++)

}return intervals.length - res;

*/}}

【知識點補充】如何自定義排序規則為公升序還是降序

設o1表示位於前面的元素,o2表示後面的元素。

如果想公升序,對於o1-o2,如果結果為負數,說明o1 < o2,符合公升序要求,負數模擬為false,表示不需要調整順序。

如果結果為正數,說明o1 > o2,不符合公升序要求,正數模擬為true,表示需要調整順序。

如果想降序,對於o2-o1,如果結果為負數,說明o2 < o1,符合降序要求,負數模擬為false,表示不需要調整順序。

如果結果為正數,說明o2 > o1,不符合降序要求,正數模擬為true,表示需要調整順序。

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,...

LeetCode 435 無重疊區間

這道題目是在給定的集合中找到需要去掉的區間最小數量,使得剩餘區間互相不重疊,題目如下 這道題目似乎無從下手,因為找重疊的區域確實是比較麻煩的。我們可以嘗試用貪心演算法來解答這個問題,我們假設有集合 int erva ls 1,2 3 5 2,3 3 6 7,8 6 7 intervals 1,2 3...