haar_lib/algo/interval_scheduling.rs
1//! 区間スケジューリング問題
2
3/// 半開区間の集合から共通部分を含まないような部分集合のうち、要素数が最大となるものを求める。
4///
5/// **Time complexity** $O(n \log n)$
6pub fn interval_scheduling<T: Ord + Copy>(intervals: &[(T, T)]) -> Vec<usize> {
7 let n = intervals.len();
8 let mut ret = vec![];
9 let mut ord = (0..n).collect::<Vec<_>>();
10 ord.sort_by(|&i, &j| intervals[i].1.cmp(&intervals[j].1));
11
12 let mut r = None;
13
14 for i in ord {
15 if r.is_none() || intervals[i].0 >= r.unwrap() {
16 ret.push(i);
17 r = Some(intervals[i].1);
18 }
19 }
20
21 ret
22}