Bird
Raised Fist0
DSA Cprogramming~5 mins

Merge Overlapping Intervals in DSA C - Time & Space Complexity

Choose your learning style10 modes available
Time Complexity: Merge Overlapping Intervals
O(n log n)
Understanding Time Complexity

We want to understand how the time needed to merge overlapping intervals changes as the number of intervals grows.

Specifically, how does the work increase when we have more intervals to merge?

Scenario Under Consideration

Analyze the time complexity of the following code snippet.


int compare(const void *a, const void *b) {
    return ((int (*)[2])a)[0][0] - ((int (*)[2])b)[0][0];
}

// Merge overlapping intervals in an array
void mergeIntervals(int intervals[][2], int n) {
    // Sort intervals by start time
    qsort(intervals, n, sizeof(intervals[0]), compare);

    int index = 0; // stores index of last merged interval
    for (int i = 1; i < n; i++) {
        if (intervals[index][1] >= intervals[i][0]) {
            if (intervals[index][1] < intervals[i][1])
                intervals[index][1] = intervals[i][1];
        } else {
            index++;
            intervals[index][0] = intervals[i][0];
            intervals[index][1] = intervals[i][1];
        }
    }
}
    

This code sorts intervals by their start time, then merges overlapping ones by updating the end time or moving to the next interval.

Identify Repeating Operations

Identify the loops, recursion, array traversals that repeat.

  • Primary operation: Sorting the intervals and then one loop to merge them.
  • How many times: Sorting takes multiple comparisons depending on n, and the loop runs once through all intervals.
How Execution Grows With Input

Sorting grows faster than just looping, so it dominates the time.

Input Size (n)Approx. Operations
10About 10 log 10 ≈ 33 operations for sorting + 10 for merging
100About 100 log 100 ≈ 664 operations for sorting + 100 for merging
1000About 1000 log 1000 ≈ 9966 operations for sorting + 1000 for merging

Pattern observation: As input grows, sorting cost grows faster than the simple loop, so total time grows roughly like n times log n.

Final Time Complexity

Time Complexity: O(n log n)

This means the time to merge intervals grows a bit faster than just the number of intervals because sorting takes extra work.

Common Mistake

[X] Wrong: "Merging intervals only takes O(n) time because we just loop once."

[OK] Correct: Before merging, we must sort intervals, which takes more time than just looping, so total time is more than O(n).

Interview Connect

Understanding this time complexity helps you explain why sorting is important before merging and shows you can analyze combined steps clearly.

Self-Check

"What if the intervals were already sorted? How would the time complexity change?"

Practice

(1/5)
1. What is the main goal of the Merge Overlapping Intervals problem?
easy
A. Find the maximum number of intervals without overlap
B. Sort intervals by their end times only
C. Combine all intervals that overlap into one continuous interval
D. Count how many intervals are in the list

Solution

  1. Step 1: Understand the problem goal

    The problem asks to merge intervals that overlap, so they become one continuous interval without gaps.
  2. Step 2: Identify the correct description

    Combine all intervals that overlap into one continuous interval correctly describes merging overlapping intervals into one combined interval.
  3. Final Answer:

    Combine all intervals that overlap into one continuous interval -> Option C
  4. Quick Check:

    Merge overlapping intervals = Combine overlaps [OK]
Hint: Think of joining overlapping time slots into one [OK]
Common Mistakes:
  • Confusing merging with sorting only
  • Counting intervals instead of merging
  • Ignoring overlaps
2. Which of the following C code snippets correctly sorts intervals by their start time before merging?
easy
A. qsort(intervals, n, sizeof(Interval), compareStart);
B. qsort(intervals, n, sizeof(Interval), compareLength);
C. sort(intervals.begin(), intervals.end());
D. qsort(intervals, n, sizeof(Interval), compareEnd);

Solution

  1. Step 1: Identify sorting criteria for merging

    Intervals must be sorted by their start time to merge correctly.
  2. Step 2: Match sorting function

    qsort(intervals, n, sizeof(Interval), compareStart); uses compareStart which sorts by start time, correct for merging.
  3. Final Answer:

    qsort(intervals, n, sizeof(Interval), compareStart); -> Option A
  4. Quick Check:

    Sort by start time = qsort with compareStart [OK]
Hint: Sort intervals by start time before merging [OK]
Common Mistakes:
  • Sorting by end time instead of start time
  • Using C++ sort syntax in C code
  • Sorting by interval length
3. What is the output of the merged intervals after running this code on input intervals: [[1,3], [2,6], [8,10], [15,18]]?
Intervals = [[1,3], [2,6], [8,10], [15,18]]
// After sorting by start time
// Merge overlapping intervals
// Print merged intervals
medium
A. [[1,6], [8,10], [15,18]]
B. [[1,3], [2,6], [8,10], [15,18]]
C. [[1,6], [2,10], [15,18]]
D. [[1,6], [8,15], [18,18]]

Solution

  1. Step 1: Sort intervals by start time

    Intervals are already sorted: [1,3], [2,6], [8,10], [15,18].
  2. Step 2: Merge overlapping intervals

    [1,3] and [2,6] overlap, merge to [1,6]. Others do not overlap.
  3. Final Answer:

    [[1,6], [8,10], [15,18]] -> Option A
  4. Quick Check:

    Merged intervals = [[1,6], [8,10], [15,18]] [OK]
Hint: Merge intervals if current start ≤ previous end [OK]
Common Mistakes:
  • Not merging overlapping intervals
  • Merging non-overlapping intervals
  • Incorrectly merging intervals with gaps
4. Identify the bug in this C code snippet for merging intervals:
Interval merged[100];
int m = 0;
merged[0] = intervals[0];
for (int i = 1; i < n; i++) {
  if (intervals[i].start <= merged[m].end) {
    merged[m].end = intervals[i].end;
  } else {
    m++;
    merged[m] = intervals[i];
  }
}
medium
A. Loop starts from 0 instead of 1
B. It incorrectly updates the end of the previous interval without checking max end
C. Uses <= instead of < in the overlap condition
D. It compares start with start instead of end

Solution

  1. Step 1: Analyze interval merging logic

    When intervals overlap, end should be max of both ends, not just assigned.
  2. Step 2: Identify incorrect update

    Code sets previous end to current end without max check, causing wrong merges.
  3. Final Answer:

    It incorrectly updates the end of the previous interval without checking max end -> Option B
  4. Quick Check:

    Use max end when merging intervals [OK]
Hint: Always update end to max of overlapping intervals [OK]
Common Mistakes:
  • Assigning end without max check
  • Using strict < instead of <= for touching intervals
  • Wrong loop start index
5. Given intervals [[1,4], [4,5], [5,6], [7,8]], what is the merged output if intervals that touch at boundaries are considered overlapping?
hard
A. [[1,8]]
B. [[1,4], [4,5], [5,6], [7,8]]
C. [[1,5], [5,6], [7,8]]
D. [[1,6], [7,8]]

Solution

  1. Step 1: Understand touching intervals as overlapping

    Intervals that share boundary points merge: [1,4] and [4,5] merge to [1,5], then with [5,6] to [1,6].
  2. Step 2: Merge intervals accordingly

    After merging first three intervals, [7,8] remains separate.
  3. Final Answer:

    [[1,6], [7,8]] -> Option D
  4. Quick Check:

    Touching intervals merge into one [OK]
Hint: Treat intervals with end == start as overlapping [OK]
Common Mistakes:
  • Not merging touching intervals
  • Merging all intervals incorrectly
  • Ignoring boundary overlap condition
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard