Я знаю алгоритм для этой проблемы (это псевдокод). (Классы сложности O(nlog(n))
, где n - количество кортежей)
Таким образом, решение сортирует Tuple по функции:
int comparer( Tuple a, Tuple b) {
if ( a.first.compareTo(b.first) == 0 ) {
return a.second.compareTo(b.second);
} else
return a.first.compareTo(b.first);
}
поэтому пример кортежа: (1, 10), (1, 5), (2, 8) будет отсортирован по:
(1,5), (1, 10), (2, 8).
Следующим шагом является накопление этого результата. Повторите этот результат и:
Tuple result = SortedList[0];
foreach ( Tuple tuple in SortedList ) {
if ( result.second < tuple.first ) {
// here you have missing number (result.second, tuple.first)
result.first = tuple.first;
result.second = tuple.second
} else if ( result.second > tuple.first ) {
// here you have overlapping number (tuple.first, min( result.second,tuple.second ))
if ( result.second < tuple.second ) {
result.second = tuple.second;
}
} else {
result.second = tuple.second;
}
}
Что мы знаем, что если будет повторяться следующий кортеж, то первое число будет больше или равно result.first. Комментируйте в коде, сообщайте, где у вас перекрывающийся и отсутствующий номер