Remove Interval

Updated on 10 July, 2025
Remove Interval header image

Problem Statement

A real number can belong to one or more intervals denoted as [a, b), where it is included in the interval if a <= x < b. Consider you have several such intervals, essentially forming a set of real numbers. These intervals are provided to you in a sorted list called intervals, where each interval [ai, bi] signifies a range from ai to bi (excluding bi). Alongside, you are given another interval called toBeRemoved. The task is to calculate a new set of intervals representing real numbers that belong to the original intervals but do not overlap with toBeRemoved. The resulting list of intervals should also be sorted and follow the similar disjoint format.

Examples

Example 1

Input:

intervals = [[0,2],[3,4],[5,7]], toBeRemoved = [1,6]

Output:

[[0,1],[6,7]]

Example 2

Input:

intervals = [[0,5]], toBeRemoved = [2,3]

Output:

[[0,2],[3,5]]

Example 3

Input:

intervals = [[-5,-4],[-3,-2],[1,2],[3,5],[8,9]], toBeRemoved = [-1,4]

Output:

[[-5,-4],[-3,-2],[4,5],[8,9]]

Constraints

  • 1 <= intervals.length <= 104
  • -109 <= ai < bi <= 109

Approach and Intuition

  1. Understand Interval Manipulation:

    • Each interval [a, b) includes elements from a up to, but not including, b.
    • If an element x lies within this interval, it must satisfy a <= x < b.
  2. Handling the Removal Process:

    • For each interval in the intervals list, consider the relationship between the interval and the toBeRemoved interval.
    • There are a few scenarios to consider:
      • The interval is entirely outside the toBeRemoved range, in which case it remains unchanged.
      • The interval is entirely within the toBeRemoved range, in which case it is omitted.
      • The interval overlaps with part of the toBeRemoved interval, in which case it needs to be truncated or split into two.
  3. Processing Edges and Overlaps:

    • Begin by iterating through each interval:
      • Compare the start and end of the interval with the start and end of toBeRemoved.
      • Depending on where the overlap occurs, if any, adjust the current interval:
        • No overlap: output the interval as is.
        • Overlap at the start: truncate the start of the interval.
        • Overlap at the end: truncate the end of the interval.
        • Overlap covers the interval: omit this interval entirely.
        • Partial coverage by toBeRemoved at both ends: split the interval into two at the points where toBeRemoved starts and ends.
  4. Efficiency Considerations:

    • Since the intervals list is sorted, you can proceed sequentially and adjust intervals without needing to re-sort.
    • The operations involved are straightforward checks and potential cuts, making the overall process efficient.

By systematically analyzing and adjusting each interval in relation to the toBeRemoved interval, you can derive the final list of intervals that excludes any numbers that fall within the toBeRemoved range.

Solutions

  • Java
java
class Solution {
    public List<List<Integer>> filterIntervals(int[][] intervals, int[] remove) {
        List<List<Integer>> output = new ArrayList<>();
        for (int[] interval : intervals) {
            if (interval[0] > remove[1] || interval[1] < remove[0]) {
                output.add(Arrays.asList(interval[0], interval[1]));
            } else {
                if (interval[0] < remove[0]) {
                    output.add(Arrays.asList(interval[0], remove[0]));
                }
                if (interval[1] > remove[1]) {
                    output.add(Arrays.asList(remove[1], interval[1]));
                }
            }
        }
        return output;
    }
}

In the Java program titled "Remove Interval", the task is to filter out sub-intervals from a list of intervals based on a given removal range. The implemented function filterIntervals accepts a 2D array intervals, indicating start and end points of each interval, and a 1D array remove, specifying the range to eliminate from these intervals. The function returns a list of intervals post modification.

The filtering process involves:

  • Iterating through each interval in the provided array.
  • Checking two conditions for each interval:
    1. If the interval falls outside the removal range completely on the left or right, add it entirely to the output.
    2. If the interval overlaps with the removal range, potentially add up to two new sub-intervals:
      • One from the start of the current interval to the start of the removal range, if there's any non-overlapping part on the left.
      • Another from the end of the removal range to the end of the current interval, if there's any non-overlapping part on the right.

The result is a list of intervals that are either unchanged (if no intersection with the removal interval) or adjusted to exclude any overlap with the removal boundary. This solution effectively manages intervals with boundaries overlapping partially or entirely with the given removal range.

  • Python
python
class Solution:
    def filterIntervals(self, ranges: List[List[int]], removalRange: List[int]) -> List[List[int]]:
    
        begin_removal, end_removal = removalRange
        result = []
    
        for start, end in ranges:
            # Verify if the current interval is unaffected
            if start > end_removal or end < begin_removal:
                result.append([start, end])
            else:
                # Check if there's a left subinterval to retain
                if start < begin_removal:
                    result.append([start, begin_removal])
                # Check if there's a right subinterval to retain
                if end > end_removal:
                    result.append([end_removal, end])
    
        return result

You want to remove specific sub-intervals from a list of intervals using Python. Here’s how to achieve that:

  • Start with defining a class Solution with a method filterIntervals. This method takes two arguments: ranges, which is a list of intervals, and removalRange, which defines the interval to remove.
  • Extract the start and end points of the removalRange.
  • Create an empty list named result to store the intervals post removal.
  • Loop through each interval in ranges.
    • For each interval (start, end), verify whether the interval is completely outside the removal range. If true, add it to the result list as it remains unaffected.
    • If there's any overlap, check for sub-intervals before and after the removalRange:
      • If the interval starts before the removalRange, add the portion (start to begin_removal) to the result.
      • If the interval ends after the removalRange, add the portion (end_removal to end) to the result.
  • Return the result list containing the filtered ranges.

This approach efficiently segregates unaffected intervals and modifies those overlapping with the removal range, ensuring all intervals are handled appropriately.

Comments

No comments yet.