Check if any K ranges overlap at any point

Given N ranges [L, R] and an integer K, the task is to check if there are any K ranges which overlap at any point.

Examples:

Input: ranges[][] = {{1, 3}, {2, 4}, {3, 4}, {7, 10}}, K = 3
Output: Yes
3 is a common point among the
ranges {1, 3}, {2, 4} and {3, 4}.



Input: ranges[][] = {{1, 2}, {3, 4}, {5, 6}, {7, 8}}, K = 2
Output: No

Approach: The idea is to make a vector of pair and store the starting point for every range as pair in this vector as (starting point, -1) and the ending point as (ending point, 1). Now, sort the vector then traverse the vector and if the current element is a starting point then push it in a stack and if it is an ending point then pop an element from the stack. If at any instance of time, the size of the stack is greater than or equal K then print Yes else print No in the end.

Below is the implementation of the above approach:

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ implementation of the approach
#include <bits/stdc++.h>
using namespace std;
  
// Comparator to sort the vector of pairs
bool sortby(const pair<int, int>& a,
            const pair<int, int>& b)
{
    if (a.first != b.first)
        return a.first < b.first;
    return (a.second < b.second);
}
  
// Function that returns true if any k
// segments overlap at any point
bool kOverlap(vector<pair<int, int> > pairs, int k)
{
    // Vector to store the starting point
    // and the ending point
    vector<pair<int, int> > vec;
    for (int i = 0; i < pairs.size(); i++) {
  
        // Starting points are marked by -1
        // and ending points by +1
        vec.push_back({ pairs[i].first, -1 });
        vec.push_back({ pairs[i].second, +1 });
    }
  
    // Sort the vector by first element
    sort(vec.begin(), vec.end());
  
    // Stack to store the overlaps
    stack<pair<int, int> > st;
  
    for (int i = 0; i < vec.size(); i++) {
        // Get the current element
        pair<int, int> cur = vec[i];
  
        // If it is the starting point
        if (cur.second == -1) {
            // Push it in the stack
            st.push(cur);
        }
  
        // It is the ending point
        else {
            // Pop an element from stack
            st.pop();
        }
  
        // If more than k ranges overlap
        if (st.size() >= k) {
            return true;
        }
    }
  
    return false;
}
  
// Driver code
int main()
{
    vector<pair<int, int> > pairs;
    pairs.push_back(make_pair(1, 3));
    pairs.push_back(make_pair(2, 4));
    pairs.push_back(make_pair(3, 5));
    pairs.push_back(make_pair(7, 10));
  
    int n = pairs.size(), k = 3;
  
    if (kOverlap(pairs, k))
        cout << "Yes";
    else
        cout << "No";
  
    return 0;
}

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python implementation of the approach
  
# Function that returns true if any k
# segments overlap at any point
def kOverlap(pairs: list, k):
  
    # Vector to store the starting point
    # and the ending point
    vec = list()
    for i in range(len(pairs)):
  
        # Starting points are marked by -1
        # and ending points by +1
        vec.append((pairs[0], -1))
        vec.append((pairs[1], 1))
  
    # Sort the vector by first element
    vec.sort(key = lambda a: a[0])
  
    # Stack to store the overlaps
    st = list()
  
    for i in range(len(vec)):
  
        # Get the current element
        cur = vec[i]
  
        # If it is the starting point
        if cur[1] == -1:
  
            # Push it in the stack
            st.append(cur)
  
        # It is the ending point
        else:
  
            # Pop an element from stack
            st.pop()
  
        # If more than k ranges overlap
        if len(st) >= k:
            return True
    return False
  
  
# Driver Code
if __name__ == "__main__":
    pairs = list()
    pairs.append((1, 3))
    pairs.append((2, 4))
    pairs.append((3, 5))
    pairs.append((7, 10))
  
    n = len(pairs)
    k = 3
  
    if kOverlap(pairs, k):
        print("Yes")
    else:
        print("No")
  
# This code is contributed by
# sanjeev2552

chevron_right


Output:

Yes



My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.



Improved By : Akanksha_Rai, sanjeev2552