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;
}