Вот еще один жадный алгоритм.
Интервалы сортируются по последнему дню, затем, если равенство по первому дню.
Затем для каждого интервала мы пытаемся вставить один дня перерыва в наборе дней встреч. Если нам это удается, мы увеличиваем количество встреч.
Вот реализация на C ++ (Извините, не знаю java. Подскажите, если непонятно)
#include <iostream>
#include <vector>
#include <set>
#include <numeric>
#include <algorithm>
int countMeetings (std::vector<int> &firstDay, std::vector<int> &lastDay) {
int count = 0;
int n = firstDay.size();
std::vector<int> sort_index (n);
std::iota (sort_index.begin(), sort_index.end(), 0); // 0, 1, 2, 3, 4
auto compar = [&firstDay, &lastDay] (int i, int j) {
if (lastDay[i] != lastDay[j]) return lastDay[i] < lastDay[j];
else return firstDay[i] < firstDay[j];
};
std::sort (sort_index.begin(), sort_index.end(), compar);
std::set<int> meetings;
for (auto i: sort_index) { // we examine all intervals
for (int j = firstDay[i]; j <= lastDay[i]; j++) { // we examine all days of the intervl
if (meetings.find(j) == meetings.end()) { // j is a possible meeding date
count++;
meetings.insert (j);
break;
}
}
}
return count;
}
int main() {
std::vector<int> firstDay = {1, 2, 3, 3, 3};
std::vector<int> lastDay= {2, 2, 3, 4, 4};
int count = countMeetings (firstDay, lastDay);
std::cout << "number of meetings = " << count << "\n";
}