How to add a new interval into a sorted array of non‑overlapping intervals in C

1 Answer

0 votes
#include <stdio.h>
#include <stdlib.h>

typedef struct {
    int start;
    int end;
} Interval;

// Append an interval to a dynamic array
void append(Interval **arr, int *size, int *capacity, Interval iv) {
    if (*size >= *capacity) {
        *capacity *= 2;
        *arr = realloc(*arr, (*capacity) * sizeof(Interval));
    }
    (*arr)[(*size)++] = iv;
}

Interval* insertInterval(Interval *intervals, int n, Interval newInterval, int *outSize) {
    int i = 0;

    // Allocate result array
    int capacity = n + 1;
    Interval *result = malloc(capacity * sizeof(Interval));
    *outSize = 0;

    // 1. Add all intervals that end BEFORE the new interval starts.
    // These cannot overlap.
    while (i < n && intervals[i].end < newInterval.start) {
        append(&result, outSize, &capacity, intervals[i]);
        i++;
    }

    // 2. Merge all intervals that DO overlap with the new interval.
    // Overlap condition: intervals[i].start <= newInterval.end
    while (i < n && intervals[i].start <= newInterval.end) {
        if (intervals[i].start < newInterval.start)
            newInterval.start = intervals[i].start;
        if (intervals[i].end > newInterval.end)
            newInterval.end = intervals[i].end;
        i++;
    }

    // Add the merged interval
    append(&result, outSize, &capacity, newInterval);

    // 3. Add all remaining intervals (those starting AFTER new interval ends)
    while (i < n) {
        append(&result, outSize, &capacity, intervals[i]);
        i++;
    }

    return result;
}

int main() {
    Interval intervals[] = {
        {1, 3},
        {6, 8},
        {13, 18}
    };
    int size = sizeof(intervals) / sizeof(intervals[0]);

    Interval newInterval1 = {9, 11};
    int size1;
    Interval *updated = insertInterval(intervals, size, newInterval1, &size1);

    Interval newInterval2 = {2, 5};
    int size2;
    Interval *updated2 = insertInterval(updated, size1, newInterval2, &size2);

    printf("Updated intervals:\n");
    for (int i = 0; i < size2; i++) {
        printf("[%d,%d] ", updated2[i].start, updated2[i].end);
    }

    free(updated);
    free(updated2);
    
    return 0;
}



/*
run:

Updated intervals:
[1,5] [6,8] [9,11] [13,18] 

*/

 



answered Apr 9 by avibootz

Related questions

...