Interval List Intersections in C++

C++Server Side ProgrammingProgramming

Suppose we have two lists of closed intervals, here each list of intervals is pairwise disjoint and in sorted order. We have ti find the intersection of these two interval lists.

We know that the closed interval [a, b] is denoted as a <= b. the set of real numbers x with a <= x <= b. The intersection of two closed intervals is a set of real numbers that is either empty, or can be represented as a closed interval.

So if the input is like A = [[0,2],[5,10],[13,23],[24,25]] and B = [[1,5],[8,12],[15,24],[25,27]], then the output will be [[1,2],[5,5],[8,10],[15,23],[24,24],[25,25]].

To solve this, we will follow these steps −

  • Make a list res, set I := 0 and j := 0

  • Define a method called intersect(), this will take a and b −

  • if a[0] <= b[0] and a[1] >= b[0], then return true,

  • otherwise when b[0] <= a[0] and b[1] >= a[0], then return true, otherwise return False

  • while I < size of A and j > size of B

    • if intersect(A[i], B[i])

      • temp := max of A[i, 0], B[j, 0], minimum of A[i,1] and B[j, 1]

      • A[i,0] := temp[1] + 1, B[j,0] := temp[1] + 1

      • if A[i,0] > A[i,1] or A[i,1] <= temp[0], then increase i by 1

      • if B[j,0]>B[j,1] or B[j,1] <= temp[0]: then increase j by 1

      • result.append(temp)

      • Skip for the next iteration

    • if A[i,0] > B[j, 1], then increase j by 1, otherwise increase i by 1

Let us see the following implementation to get better understanding −

Example

 Live Demo

class Solution(object):
   def intervalIntersection(self, A, B):
   result = []
   i,j = 0,0
   while i < len(A) and j < len(B):
      if self.intersect(A[i],B[j]):
         temp = [max(A[i][0],B[j][0]),min(A[i][1],B[j][1])]
         A[i][0]=temp[1]+1
         B[j][0] = temp[1]+1
         if A[i][0] > A[i][1] or A[i][1] <= temp[0]:
            i+=1
         if B[j][0]>B[j][1] or B[j][1] <= temp[0]:
            j+=1
         result.append(temp)
         continue
      if A[i][0]>B[j][1]:
         j+=1
      else:
         i+=1
   return result
   def intersect(self,a,b):
      if a[0]<=b[0] and a[1]>=b[0]:
         return True
      if b[0]<=a[0] and b[1] >=a[0]:
         return True
      return False
ob = Solution()
print(ob.intervalIntersection([[0,2],[5,10],[13,23],[24,25]],[[1,5],[8,12],[15,24],[25,27]]))

Input

[[0,2],[5,10],[13,23],[24,25]]
[[1,5],[8,12],[15,24],[25,27]]

Output

[[1, 2], [5, 5], [8, 10], [15, 23], [24, 24], [25, 25]]
raja
Updated on 02-May-2020 10:36:38

Advertisements