Time complexity: O(nlogn)
Space: O(n)
class Solution {
public:
struct CarInterval{
int start;
int end;
};
bool CanMerge(CarInterval& car_interval1, CarInterval& car_interval2) {
if (car_interval2.start <= car_interval1.end) {
return true;
}
return false;
auto car_interval_comparator = [](CarInterval& car_interval1, CarInterval& car_interval2) {
if (car_interval1.start == car_interval2.start) {
return car_interval1.end >= car_interval2.end;
}
return car_interval1.start > car_interval2.start;
};
std::priority_queue<CarInterval, std::vector<CarInterval>, decltype(car_interval_comparator)> car_intervals;
for(auto car : nums) {
car_intervals.push(
CarInterval{
.start = car[0],
.end = car[1]
}
);
}
// finally merge
std::vector<CarInterval> merged_cars;
while(car_intervals.size() > 1) {
CarInterval first_car = car_intervals.top();
car_intervals.pop();
CarInterval second_car = car_intervals.top();
car_intervals.pop();
if (CanMerge(first_car, second_car)) {
CarInterval merged_car = CarInterval{
.start = std::min(first_car.start, second_car.start),
.end = std::max(first_car.end, second_car.end)
};
car_intervals.push(
merged_car
);
continue;
}
// othewise collect the first car and then put back the second car
merged_cars.push_back(first_car);
car_intervals.push(second_car);
}
// finally collect the last remaining car
CarInterval final_car = car_intervals.top();
car_intervals.pop();
merged_cars.push_back(final_car);
int count_points = 0;
for(auto car_interval : merged_cars) {
count_points += (car_interval.end - car_interval.start + 1);
}
return count_points;
}
};