貪心演算法-找不重疊的區間段

MadAdam發表於2024-09-17

1.說明

有N個區間片段,查詢其中不重疊的片段最大個數。例如(6 8),(2 4),(3 5),(1 5),(5 9),(8 10)這6個片段中,不重疊的片段最大個數為3,分別為(2 4),(6 8),(8 10)。

2.解析

先按照起始位置從小到大進行排序,使用貪心演算法使有效片段儘可能小,即結束位置更靠前。當前片段如果屬於上個有效片段的子段,則上個有效片段無效,被當前片段替代;當前片段如果和上個有效片段不重疊,則記作有效片段。
1.將N個片段按照起始位置從小到大進行排序,(1 5),(2 4),(3 5),(5 9),(6 8),(8 10)。
2.按照上述判斷方法遍歷這N個片段,找出不重疊的有效欄位,如下圖所示,分別為"新1"、"新2"、"3"這三個片段。

3.程式碼實現

int findMostIntervals(vector<vector<int>> intervals, int n) 
{
    if(n==1)
        return 1;
int result=0;
sort(intervals.begin(),intervals.end(),[](vector<int>a,vector<int>b){
    return a[0]<b[0];//按照起始位置從小到大排序
});
int curStart,curEnd=0;
int preStart=intervals[0][0];
int preEnd=intervals[0][1];
result++;//先將第一個片段當作有效片段
auto it=intervals.begin();
for(++it;it!=intervals.end();++it)//從第二個片段開始遍歷
{
    curStart=(*it)[0];
    curEnd=(*it)[1];
    //case1
    if(curStart>=preStart && curEnd<=preEnd)
    {
        //巧:更新絕對不可能更壞的結果,因為新的片段結束位置更小
        preStart=curStart;
        preEnd=curEnd;
    }
    //case 2
    else if(curStart>=preEnd) //新的有效片段
    {
        result++;
        preStart=curStart;
        preEnd=curEnd;
    }
}
return result;

}

相關文章