赞
踩
题目:
题解:
- struct pair {
- int first, second;
- };
-
- struct Heap {
- struct pair* heap;
- int heapSize;
- bool (*cmp)(struct pair*, struct pair*);
- };
-
- void init(struct Heap* obj, int n, bool (*cmp)(struct pair*, struct pair*)) {
- obj->heap = malloc(sizeof(struct pair) * (n + 1));
- obj->heapSize = 0;
- obj->cmp = cmp;
- }
-
- bool cmp1(struct pair* a, struct pair* b) {
- return a->second < b->second;
- }
-
- void swap(struct pair* a, struct pair* b) {
- struct pair tmp = *a;
- *a = *b, *b = tmp;
- }
-
- void push(struct Heap* obj, int x, int y) {
- int p = ++(obj->heapSize), q = p >> 1;
- obj->heap[p] = (struct pair){x, y};
- while (q) {
- if (!obj->cmp(&(obj->heap[q]), &(obj->heap[p]))) {
- break;
- }
- swap(&(obj->heap[q]), &(obj->heap[p]));
- p = q, q = p >> 1;
- }
- }
-
- void pop(struct Heap* obj) {
- swap(&(obj->heap[1]), &(obj->heap[(obj->heapSize)--]));
- int p = 1, q = p << 1;
- while (q <= obj->heapSize) {
- if (q + 1 <= obj->heapSize) {
- if (obj->cmp(&(obj->heap[q]), &(obj->heap[q + 1]))) {
- q++;
- }
- }
- if (!obj->cmp(&(obj->heap[p]), &(obj->heap[q]))) {
- break;
- }
- swap(&(obj->heap[q]), &(obj->heap[p]));
- p = q, q = p << 1;
- }
- }
-
- struct pair top(struct Heap* obj) {
- return obj->heap[1];
- }
-
- bool empty(struct Heap* obj) {
- return obj->heapSize == 0;
- }
-
- int cmp(int* a, int* b) {
- return *a - *b;
- }
-
- int** getSkyline(int** buildings, int buildingsSize, int* buildingsColSize, int* returnSize, int** returnColumnSizes) {
- int n = buildingsSize;
- struct Heap* heap = malloc(sizeof(struct Heap));
- init(heap, n << 1, cmp1);
-
- int boundaries[n << 1];
- for (int i = 0; i < n; i++) {
- boundaries[i << 1] = buildings[i][0];
- boundaries[i << 1 | 1] = buildings[i][1];
- }
- qsort(boundaries, n << 1, sizeof(int), cmp);
-
- int** ret = malloc(sizeof(int*) * (n << 1));
- *returnColumnSizes = malloc(sizeof(int) * (n << 1));
- *returnSize = 0;
- int idx = 0;
- for (int i = 0; i < (n << 1); i++) {
- int boundary = boundaries[i];
- while (idx < n && buildings[idx][0] <= boundary) {
- push(heap, buildings[idx][1], buildings[idx][2]);
- idx++;
- }
- while (!empty(heap) && top(heap).first <= boundary) {
- pop(heap);
- }
-
- int maxn = empty(heap) ? 0 : top(heap).second;
- if ((*returnSize) == 0 || maxn != ret[(*returnSize) - 1][1]) {
- int* tmp = malloc(sizeof(int) * 2);
- tmp[0] = boundary, tmp[1] = maxn;
- (*returnColumnSizes)[*returnSize] = 2;
- ret[(*returnSize)++] = tmp;
- }
- }
- return ret;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。