生活随笔
收集整理的這篇文章主要介紹了
动态规划/贪心 - 无重叠区间
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
- 動態規劃
dp[i]dp[i]dp[i]表示以區間iii結尾,可以共存最多的區間數量。
dp[i]=max(dp[i],dp[j]+1)dp[i] = max(dp[i], dp[j] + 1)dp[i]=max(dp[i],dp[j]+1),區間jjj滿足右邊界≤\le≤區間iii的左邊界。
class Solution {
public:int eraseOverlapIntervals(vector
<vector
<int>>& intervals
) {int n
= intervals
.size();if (n
< 2) {return 0;}sort(intervals
.begin(), intervals
.end(), [](vector
<int> &l
, vector
<int> &r
) {return l
[0] < r
[0];});vector
<int> dp(n
, 1);for (int i
= 1; i
< n
; ++i
) {for (int j
= 0; j
< i
; ++j
) {if (intervals
[j
][1] <= intervals
[i
][0]) {dp
[i
] = max(dp
[i
], dp
[j
] + 1);}}}return n
- *max_element(dp
.begin(), dp
.end());}
};
class Solution:def eraseOverlapIntervals(self
, intervals
: List
[List
[int]]) -> int:if not intervals
:return 0intervals
.sort
()n
= len(intervals
)f
= [1]for i
in range(1, n
):f
.append
(max((f
[j
] for j
in range(i
) if intervals
[j
][1] <= intervals
[i
][0]), default
=0) + 1)return n
- max(f
)
- 貪心
區間按照右端點排序,每次貪心的找最左邊的區間,因為這就是最優的。
class Solution {
public:int eraseOverlapIntervals(vector
<vector
<int>>& intervals
) {int n
= intervals
.size();if (n
< 2) {return 0;}sort(intervals
.begin(), intervals
.end(), [](vector
<int> &l
, vector
<int> &r
) {return l
[1] < r
[1];});int ret
= 0;int pre
= intervals
[0][1];for (int i
= 1; i
< n
; ++i
) {if (intervals
[i
][0] < pre
) {ret
++;}else {pre
= intervals
[i
][1];}}return ret
;}
};
class Solution:def eraseOverlapIntervals(self
, intervals
: List
[List
[int]]) -> int:if not intervals
:return 0intervals
.sort
(key
=lambda x
: x
[1])n
= len(intervals
)ret
= 0right
= intervals
[0][1]for i
in range(1, n
):if intervals
[i
][0] < right
:ret
+= 1else:right
= intervals
[i
][1]return ret
總結
以上是生活随笔為你收集整理的动态规划/贪心 - 无重叠区间的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。