📜  查找所有区间的交集

📅  最后修改于: 2021-04-24 21:31:07             🧑  作者: Mango

给定N个[l,r]形式的间隔,任务是找到所有间隔的交集。相交是位于所有给定区间内的区间。如果不存在这样的交集,则打印-1

例子:

方法:

  • 首先将第一个时间间隔视为必需的答案。
  • 现在,从第二个间隔开始,尝试搜索相交。可能出现两种情况:
    1. [l1,r1][l2,r2]之间不存在交集。仅当r1 r2 时才可能。在这种情况下,答案将为0,即不存在交集。
    2. [l1,r1][l2,r2]之间存在一个交集。然后,所需的交点将为[max(l1,l2),min(r1,r2)]

下面是上述方法的实现:

C++
// C++ implementation of the approach
#include 
using namespace std;
  
// Function to print the intersection
void findIntersection(int intervals[][2], int N)
{
    // First interval
    int l = intervals[0][0];
    int r = intervals[0][1];
  
    // Check rest of the intervals and find the intersection
    for (int i = 1; i < N; i++) {
  
        // If no intersection exists
        if (intervals[i][0] > r || intervals[i][1] < l) {
            cout << -1;
            return;
        }
  
        // Else update the intersection
        else {
            l = max(l, intervals[i][0]);
            r = min(r, intervals[i][1]);
        }
    }
  
    cout << "[" << l << ", " << r << "]";
}
  
// Driver code
int main()
{
    int intervals[][2] = {
        { 1, 6 },
        { 2, 8 },
        { 3, 10 },
        { 5, 8 }
    };
    int N = sizeof(intervals) / sizeof(intervals[0]);
    findIntersection(intervals, N);
}


Java
// Java implementation of the approach
import java.io.*;
  
class GFG
{
      
// Function to print the intersection
static void findIntersection(int intervals[][], int N)
{
    // First interval
    int l = intervals[0][0];
    int r = intervals[0][1];
  
    // Check rest of the intervals
    // and find the intersection
    for (int i = 1; i < N; i++) 
    {
  
        // If no intersection exists
        if (intervals[i][0] > r || 
            intervals[i][1] < l) 
        {
            System.out.println(-1);
            return;
        }
  
        // Else update the intersection
        else
        {
            l = Math.max(l, intervals[i][0]);
            r = Math.min(r, intervals[i][1]);
        }
    }
    System.out.println ("[" + l +", " + r + "]");
}
  
    // Driver code
    public static void main (String[] args) 
    {
  
        int intervals[][] = {{ 1, 6 },
                            { 2, 8 },
                            { 3, 10 },
                            { 5, 8 }};
        int N = intervals.length;
        findIntersection(intervals, N);
    }
}
  
// This Code is contributed by ajit..


Python
# Python3 implementation of the approach
  
# Function to print the intersection
def findIntersection(intervals,N):
  
    # First interval
    l = intervals[0][0]
    r = intervals[0][1]
  
    # Check rest of the intervals 
    # and find the intersection
    for i in range(1,N):
  
        # If no intersection exists
        if (intervals[i][0] > r or intervals[i][1] < l):
            print(-1)
  
        # Else update the intersection
        else:
            l = max(l, intervals[i][0])
            r = min(r, intervals[i][1])
          
      
  
    print("[",l,", ",r,"]")
  
# Driver code
  
intervals= [
            [ 1, 6 ],
            [ 2, 8 ],
            [ 3, 10 ],
            [ 5, 8 ]
            ]
N =len(intervals)
findIntersection(intervals, N)
  
# this code is contributed by mohit kumar


C#
// C# implementation of the approach 
using System;
  
class GFG 
{ 
      
// Function to print the intersection 
static void findIntersection(int [,]intervals, int N) 
{ 
    // First interval 
    int l = intervals[0, 0]; 
    int r = intervals[0, 1]; 
  
    // Check rest of the intervals 
    // and find the intersection 
    for (int i = 1; i < N; i++) 
    { 
  
        // If no intersection exists 
        if (intervals[i, 0] > r || 
            intervals[i, 1] < l) 
        { 
            Console.WriteLine(-1); 
            return; 
        } 
  
        // Else update the intersection 
        else
        { 
            l = Math.Max(l, intervals[i, 0]); 
            r = Math.Min(r, intervals[i, 1]); 
        } 
    } 
    Console.WriteLine("[" + l + ", " + r + "]"); 
} 
  
// Driver code 
public static void Main() 
{ 
    int [,]intervals = {{ 1, 6 }, { 2, 8 }, 
                        { 3, 10 }, { 5, 8 }}; 
    int N = intervals.GetLength(0); 
    findIntersection(intervals, N); 
} 
} 
  
// This code is contributed by Ryuga


PHP
 $r || 
            $intervals[$i][1] < $l) 
        {
            echo -1;
            return;
        }
  
        // Else update the intersection
        else
        {
            $l = max($l, $intervals[$i][0]);
            $r = min($r, $intervals[$i][1]);
        }
    }
  
    echo "[" . $l . ", " . $r . "]";
}
  
// Driver code
$intervals = array(array(1, 6), array(2, 8),
                   array(3, 10), array(5, 8));
$N = sizeof($intervals);
findIntersection($intervals, $N);
  
// This code is contributed
// by Akanksha Rai
?>


输出:
[5, 6]