How to remove the minimum number of intervals so that the remaining intervals do not overlap in C++

1 Answer

0 votes
#include <iostream>
#include <vector>
#include <algorithm>

struct Interval {
    int start;
    int end;
};

// Returns how many intervals must be removed
int eraseMinimumOverlaps(std::vector<Interval>& intervals) {
    if (intervals.empty())
        return 0;

    // Sort by end time
    std::sort(intervals.begin(), intervals.end(),
              [](const Interval& a, const Interval& b) {
                  return a.end < b.end;
              });

    int removed = 0;
    int lastEnd = intervals[0].end;

    for (size_t i = 1; i < intervals.size(); i++) {
        if (intervals[i].start < lastEnd) {
            // Overlap → remove this interval
            removed++;
        } else {
            // No overlap → keep it
            lastEnd = intervals[i].end;
        }
    }

    return removed;
}

// Returns the intervals that remain after removing overlaps
std::vector<Interval> keepNonOverlapping(std::vector<Interval> intervals) {
    if (intervals.empty())
        return {};

    std::sort(intervals.begin(), intervals.end(),
              [](const Interval& a, const Interval& b) {
                  return a.end < b.end;
              });

    std::vector<Interval> result;
    result.push_back(intervals[0]);
    int lastEnd = intervals[0].end;

    for (size_t i = 1; i < intervals.size(); i++) {
        if (intervals[i].start >= lastEnd) {
            result.push_back(intervals[i]);
            lastEnd = intervals[i].end;
        }
    }

    return result;
}

int main() {
    // The only overlap is between [5,7] and [4,10]
    // To keep the most intervals, we keep the one that ends earlier → [5,7]
    std::vector<Interval> v = {{1,3}, {5,7}, {4,10}, {11,14}};

    int removed = eraseMinimumOverlaps(v);
    auto kept = keepNonOverlapping(v);

    std::cout << "Removed: " << removed << "\nKept: ";
    for (auto& x : kept)
        std::cout << "[" << x.start << "," << x.end << "] ";
}



/*
run:

Removed: 1
Kept: [1,3] [5,7] [11,14] 

*/

 



answered Apr 9 by avibootz

Related questions

...