diff --git a/include/solution/1353.h b/include/solution/1353.h new file mode 100644 index 0000000..0181c5f --- /dev/null +++ b/include/solution/1353.h @@ -0,0 +1,17 @@ +// +// Created by gint on 2025/7/7. +// + +#ifndef INC_1353_H +#define INC_1353_H +#ifdef __cplusplus +extern "C" +{ +#endif + + int maxEvents(int **events, int eventsSize, int *eventsColSize); + +#ifdef __cplusplus +} +#endif +#endif // INC_1353_H diff --git a/src/1353.c b/src/1353.c new file mode 100644 index 0000000..1058080 --- /dev/null +++ b/src/1353.c @@ -0,0 +1,91 @@ +// +// Created by gint on 2025/7/7. +// +#include + +int cmpEvent(const void *a, const void *b) +{ + int *eventA = *(int **)a; + int *eventB = *(int **)b; + return eventA[0] - eventB[0]; +} + +int compare(const void *a, const void *b) +{ + return *(int *)a - *(int *)b; +} + +// 简易小根堆操作 +void push(int *heap, int *size, int val) +{ + int i = (*size)++; + heap[i] = val; + while (i > 0 && heap[(i - 1) / 2] > heap[i]) + { + int tmp = heap[i]; + heap[i] = heap[(i - 1) / 2]; + heap[(i - 1) / 2] = tmp; + i = (i - 1) / 2; + } +} + +int pop(int *heap, int *size) +{ + int result = heap[0]; + heap[0] = heap[--(*size)]; + int i = 0; + while (i * 2 + 1 < *size) + { + int j = i * 2 + 1; + if (j + 1 < *size && heap[j + 1] < heap[j]) + j++; + if (heap[i] <= heap[j]) + break; + int tmp = heap[i]; + heap[i] = heap[j]; + heap[j] = tmp; + i = j; + } + return result; +} + +int maxEvents(int **events, int eventsSize, int *eventsColSize) +{ + qsort(events, eventsSize, sizeof(int *), cmpEvent); + + int minDay = events[0][0], maxDay = 0; + for (int i = 0; i < eventsSize; i++) + { + if (events[i][1] > maxDay) + maxDay = events[i][1]; + } + + int heap[eventsSize]; + int heapSize = 0; + + int day = minDay, idx = 0, res = 0; + + for (day = minDay; day <= maxDay; day++) + { + // 把今天开始的会议加进堆 + while (idx < eventsSize && events[idx][0] == day) + { + push(heap, &heapSize, events[idx][1]); + idx++; + } + + // 去掉已过期的会议 + while (heapSize > 0 && heap[0] < day) + { + pop(heap, &heapSize); + } + + // 选择今天可以开的最早结束的会议 + if (heapSize > 0) + { + pop(heap, &heapSize); + res++; + } + } + return res; +} diff --git a/tests/test_1353.cpp b/tests/test_1353.cpp new file mode 100644 index 0000000..942204c --- /dev/null +++ b/tests/test_1353.cpp @@ -0,0 +1,58 @@ +#include +#include + +// 辅助函数:创建二维数组 +int **create2DArray(const std::vector> &input, int *colSizeArray) +{ + int **arr = new int *[input.size()]; + for (size_t i = 0; i < input.size(); ++i) + { + arr[i] = new int[input[i].size()]; + colSizeArray[i] = static_cast(input[i].size()); + for (size_t j = 0; j < input[i].size(); ++j) + { + arr[i][j] = input[i][j]; + } + } + return arr; +} + +// 辅助函数:释放二维数组 +void free2DArray(int **arr, int size) +{ + for (int i = 0; i < size; ++i) + { + delete[] arr[i]; + } + delete[] arr; +} + +// Test1 +TEST(MaxEventsTest, Test1) +{ + std::vector> input = {{1, 2}, {2, 3}, {3, 4}}; + int eventsSize = static_cast(input.size()); + int *eventsColSize = new int[eventsSize]; + int **events = create2DArray(input, eventsColSize); + + int expected = 3; + EXPECT_EQ(maxEvents(events, eventsSize, eventsColSize), expected); + + free2DArray(events, eventsSize); + delete[] eventsColSize; +} + +// Test2 +TEST(MaxEventsTest, Test2) +{ + std::vector> input = {{1, 2}, {2, 3}, {3, 4}, {1, 2}}; + int eventsSize = static_cast(input.size()); + int *eventsColSize = new int[eventsSize]; + int **events = create2DArray(input, eventsColSize); + + int expected = 4; + EXPECT_EQ(maxEvents(events, eventsSize, eventsColSize), expected); + + free2DArray(events, eventsSize); + delete[] eventsColSize; +} \ No newline at end of file