This commit is contained in:
2025-07-07 22:40:23 +08:00
parent 3d6aa12717
commit 44e5b938c9
3 changed files with 166 additions and 0 deletions

17
include/solution/1353.h Normal file
View File

@@ -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

91
src/1353.c Normal file
View File

@@ -0,0 +1,91 @@
//
// Created by gint on 2025/7/7.
//
#include <stdlib.h>
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;
}

58
tests/test_1353.cpp Normal file
View File

@@ -0,0 +1,58 @@
#include <gtest/gtest.h>
#include <solution/1353.h>
// 辅助函数:创建二维数组
int **create2DArray(const std::vector<std::vector<int>> &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<int>(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<std::vector<int>> input = {{1, 2}, {2, 3}, {3, 4}};
int eventsSize = static_cast<int>(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<std::vector<int>> input = {{1, 2}, {2, 3}, {3, 4}, {1, 2}};
int eventsSize = static_cast<int>(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;
}