Non-overlapping Intervals in C++

Suppose we have a collection of intervals; we have to find the minimum number of intervals we need to remove to make the rest of the intervals non-overlapping. So if the intervals are [[1,2], [2,3], [3,4], [1,3]], then the output will be 1, as we have to remove [1,3] to make all others are non-overlapping.

To solve this, we will follow these steps −

• n := size of array

• if n is 0, then return 0

• count := 1

• sort the array based on the end time of the intervals

• end := end date of the first interval

• for i in range 1 to n – 1

• if start time of arr[i] >= end, then

• end := end time of arr[i]

• increase count by 1

• return n – count

Let us see the following implementation to get better understanding −

Example

Live Demo

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
static bool cmp(vector <int>& a, vector <int>& b){
return a[1] < b[1];
}
int eraseOverlapIntervals(vector<vector<int>>& arr) {
int n = arr.size();
if(!n)return 0;
int cnt = 1;
sort(arr.begin(), arr.end(), cmp);
int end = arr[0][1];
for(int i = 1; i < n; i++){
if(arr[i][0] >= end){
end = arr[i][1];
cnt++;
}
}
return n - cnt;
}
};
main(){
vector<vector<int>> v = {{1,2},{1,2},{1,2}};
Solution ob;
cout << (ob.eraseOverlapIntervals(v));
}

Input

[[1,2],[1,2],[1,2]]

Output

2

Updated on: 30-Apr-2020

466 Views