1.トピック
間隔のリストを提供します。リスト内の他の間隔でカバーされている間隔を削除してください。
c <= aおよびb <= dの場合にのみ、区間[a、b)が区間[c、d)でカバーされていると見なします。
すべての削除操作が完了したら、リストの残りの間隔の数を返してください。
例:
入力:intervals = [[1,4]、[3,6]、[2,8]]出力:2説明:間隔[3,6]は間隔[2,8]
でカバーされているため、削除されます。
2:コード
アイデア:
- この質問では、欲張りアルゴリズム、最初の並べ替え(開始時刻の昇順並べ替え)を使用して、開始時刻と終了時刻が同じ間隔を降順で並べ替えることができます。
- 並べ替え後、各間隔をトラバースします。end> prev_endの場合、間隔が前の間隔cnt ++でカバーされていないことを意味します。
class Solution {
private:
static bool cmp(const vector<int> &a,const vector<int> &b){
if(a[0]==b[0]){
return a[1]>=b[1];
}else return a[0]<b[0];
}
public:
int removeCoveredIntervals(vector<vector<int>>& intervals) {
sort(intervals.begin(),intervals.end(),cmp);
int prev_end=0,end=0,cnt=0;
for(auto i:intervals){
end=i[1];
// cout<<i[0]<<'\t'<<i[1]<<endl;
if(end>prev_end){
cnt++;
prev_end=end;
}
}
return cnt;
}
};
注意:
- sort()関数を使用する場合、3番目のパラメーターは比較関数です。これは静的メンバー関数(クラスのメンバー関数はデフォルトでパラメーターを追加し、静的は追加されません)、または非静的メンバー関数である必要があります。クラスメンバー関数、またはラムダ関数
- ラムダ関数の記述:
sort(intervals.begin(),intervals.end(),[](const vector<int> &a,const vector<int> &b){
return a[0]==b[0]?a[1]>=b[1]:a[0]<b[0];
});
- 比較関数のパラメーター:const&を記述する必要があります。そうしないと、一般的な型を記述すると、意味のないコピーが多数発生し、時間が長くなります。