#include <stdio.h>
#include <stdlib.h>
// Structure for a meeting interval
typedef struct {
int start;
int end;
} Interval;
// Compare function for qsort to sort intervals by start time
int compare(const void *a, const void *b) {
Interval *i1 = (Interval *)a;
Interval *i2 = (Interval *)b;
return i1->start - i2->start;
}
// Min-heap structure for end times
typedef struct {
int *arr;
int size;
int capacity;
} MinHeap;
MinHeap* createHeap(int capacity) {
MinHeap *heap = (MinHeap *)malloc(sizeof(MinHeap));
heap->arr = (int *)malloc(sizeof(int) * capacity);
heap->size = 0;
heap->capacity = capacity;
return heap;
}
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
void heapifyUp(MinHeap *heap, int index) {
while (index > 0) {
int parent = (index - 1) / 2;
if (heap->arr[parent] <= heap->arr[index])
break;
swap(&heap->arr[parent], &heap->arr[index]);
index = parent;
}
}
void heapifyDown(MinHeap *heap, int index) {
int left, right, smallest;
while (1) {
left = 2 * index + 1;
right = 2 * index + 2;
smallest = index;
if (left < heap->size && heap->arr[left] < heap->arr[smallest])
smallest = left;
if (right < heap->size && heap->arr[right] < heap->arr[smallest])
smallest = right;
if (smallest == index)
break;
swap(&heap->arr[smallest], &heap->arr[index]);
index = smallest;
}
}
void insertHeap(MinHeap *heap, int val) {
if (heap->size == heap->capacity) return; // no resize for simplicity
heap->arr[heap->size] = val;
heapifyUp(heap, heap->size);
heap->size++;
}
int getMin(MinHeap *heap) {
if (heap->size == 0) return -1;
return heap->arr[0];
}
void removeMin(MinHeap *heap) {
if (heap->size == 0) return;
heap->arr[0] = heap->arr[heap->size - 1];
heap->size--;
heapifyDown(heap, 0);
}
int minMeetingRooms(Interval* intervals, int intervalsSize) {
if (intervalsSize == 0) return 0;
// Sort intervals by start time
qsort(intervals, intervalsSize, sizeof(Interval), compare);
// Create min heap for end times
MinHeap *heap = createHeap(intervalsSize);
// Add first meeting end time
insertHeap(heap, intervals[0].end);
for (int i = 1; i < intervalsSize; i++) {
int earliestEnd = getMin(heap);
if (intervals[i].start >= earliestEnd) {
// Room freed, remove earliest end
removeMin(heap);
}
// Add current meeting end time
insertHeap(heap, intervals[i].end);
}
int rooms = heap->size;
free(heap->arr);
free(heap);
return rooms;
}
int main() {
Interval meetings[] = {{1,4}, {2,5}, {7,9}};
int n = sizeof(meetings) / sizeof(meetings[0]);
int result = minMeetingRooms(meetings, n);
printf("Minimum rooms needed: %d\n", result);
return 0;
}
qsort(intervals, intervalsSize, sizeof(Interval), compare);
Sort meetings by start time to process in order
insertHeap(heap, intervals[0].end);
Add first meeting end time to heap
int earliestEnd = getMin(heap);
Get earliest finishing meeting end time
if (intervals[i].start >= earliestEnd) { removeMin(heap); }
If current meeting starts after earliest end, reuse room by removing earliest end
insertHeap(heap, intervals[i].end);
Add current meeting end time to heap