题目 <https://leetcode-cn.com/problems/the-skyline-problem/>
一点一点列出所有情况...真朴素
最后还得处理[[1,2,1],[1,2,2],[1,2,3],[2,3,1],[2,3,2],[2,3,3]]这种情况
/**
* Return an array of arrays of size *returnSize.
* The sizes of the arrays are returned as *returnColumnSizes array.
* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
*/
void sort(int** buildings, int buildingsSize, int* buildingsColSize,int index){
int i;
int build_start,build_end,build_heigh;
for(i=index;i<buildingsSize-1;i++){
if(buildings[i][0] <= buildings[i+1][0])
break;
build_start = buildings[i][0];
build_end = buildings[i][1];
build_heigh = buildings[i][2];
buildings[i][0] = buildings[i+1][0];
buildings[i][1] = buildings[i+1][1];
buildings[i][2] = buildings[i+1][2];
buildings[i+1][0] = build_start;
buildings[i+1][1] = build_end;
buildings[i+1][2] = build_heigh;
}
}
int** getSkyline(int** buildings, int buildingsSize, int* buildingsColSize, int* returnSize, int** returnColumnSizes){
int **returnNums = malloc(sizeof(int*) * 20000);
int *returnColSizes = malloc(sizeof(int) * 20000);
int returnLen = 0;
int i,j;
int build_start,build_end,build_heigh;
int build_start_tmp,build_end_tmp,build_heigh_tmp;
build_start = buildings[0][0];
build_end = buildings[0][1];
build_heigh = buildings[0][2];
for(i=0;i<buildingsSize;i++){
if(buildings[i][0] == build_start){
if(buildings[i][2] == build_heigh){
if(buildings[i][1] == build_end){
//do nothing
}else if(buildings[i][1] > build_end){
build_end = buildings[i][1];
}else{//buildings[i][1] < build_end
//do nothing
}
}else if(buildings[i][2] > build_heigh){
if(buildings[i][1] == build_end){
build_heigh = buildings[i][2];
}else if(buildings[i][1] > build_end){
build_heigh = buildings[i][2];
build_end = buildings[i][1];
}else{//buildings[i][1] < build_end
build_start_tmp = buildings[i][1];
build_end_tmp = build_end;
build_heigh_tmp = build_heigh;
build_heigh = buildings[i][2];
build_end = buildings[i][1];
buildings[i][0] = build_start_tmp;
buildings[i][1] = build_end_tmp;
buildings[i][2] = build_heigh_tmp;
sort(buildings,buildingsSize,buildingsColSize,i);
i--;
}
}else{//buildings[i][2] < build_heigh
if(buildings[i][1] == build_end){
//do nothing
}else if(buildings[i][1] > build_end){
build_start_tmp = build_end;
build_end_tmp = buildings[i][1];
build_heigh_tmp = buildings[i][2];
buildings[i][0] = build_start_tmp;
buildings[i][1] = build_end_tmp;
buildings[i][2] = build_heigh_tmp;
sort(buildings,buildingsSize,buildingsColSize,i);
i--;
}else{//buildings[i][1] < build_end
//do nothing
}
}
}else if(buildings[i][0] > build_start && buildings[i][0] < build_end){//
if(buildings[i][2] == build_heigh){
if(buildings[i][1] == build_end){
//do nothing
}else if(buildings[i][1] > build_end){
build_end = buildings[i][1];
}else{//buildings[i][1] < build_end
//do nothing
}
}else if(buildings[i][2] > build_heigh){
if(buildings[i][1] == build_end){
returnColSizes[returnLen] = 2;
returnNums[returnLen] = malloc(sizeof(int) * 2);
returnNums[returnLen][0] = build_start;returnNums[returnLen][1] = build_heigh;
returnLen++;
build_start = buildings[i][0];
build_end = buildings[i][1];
build_heigh = buildings[i][2];
}else if(buildings[i][1] > build_end){
returnColSizes[returnLen] = 2;
returnNums[returnLen] = malloc(sizeof(int) * 2);
returnNums[returnLen][0] = build_start;returnNums[returnLen][1] = build_heigh;
returnLen++;
build_start = buildings[i][0];
build_end = buildings[i][1];
build_heigh = buildings[i][2];
}else{//buildings[i][1] < build_end
returnColSizes[returnLen] = 2;
returnNums[returnLen] = malloc(sizeof(int) * 2);
returnNums[returnLen][0] = build_start;returnNums[returnLen][1] = build_heigh;
returnLen++;
build_start_tmp = buildings[i][1];
build_end_tmp = build_end;
build_heigh_tmp = build_heigh;
build_start = buildings[i][0];
build_end = buildings[i][1];
build_heigh = buildings[i][2];
buildings[i][0] = build_start_tmp;
buildings[i][1] = build_end_tmp;
buildings[i][2] = build_heigh_tmp;
sort(buildings,buildingsSize,buildingsColSize,i);
i--;
}
}else {//buildings[i][2] < build_heigh
if(buildings[i][1] == build_end){
//do nothing
}else if(buildings[i][1] > build_end){
build_start_tmp = build_end;
build_end_tmp = buildings[i][1];
build_heigh_tmp = buildings[i][2];
buildings[i][0] = build_start_tmp;
buildings[i][1] = build_end_tmp;
buildings[i][2] = build_heigh_tmp;
sort(buildings,buildingsSize,buildingsColSize,i);
i--;
}else{//buildings[i][1] < build_end
//do nothing
}
}
}else if(buildings[i][0] == build_end){
if(buildings[i][2] == build_heigh){
build_end = buildings[i][1];
}else if(buildings[i][2] > build_heigh){
returnColSizes[returnLen] = 2;
returnNums[returnLen] = malloc(sizeof(int) * 2);
returnNums[returnLen][0] = build_start;returnNums[returnLen][1] = build_heigh;
returnLen++;
build_start = buildings[i][0];
build_end = buildings[i][1];
build_heigh = buildings[i][2];
}else{//buildings[i][2] < build_heigh
returnColSizes[returnLen] = 2;
returnNums[returnLen] = malloc(sizeof(int) * 2);
returnNums[returnLen][0] = build_start;returnNums[returnLen][1] = build_heigh;
returnLen++;
build_start = buildings[i][0];
build_end = buildings[i][1];
build_heigh = buildings[i][2];
}
}else if(buildings[i][0] > build_end){
returnColSizes[returnLen] = 2;
returnNums[returnLen] = malloc(sizeof(int) * 2);
returnNums[returnLen][0] = build_start;returnNums[returnLen][1] = build_heigh;
returnLen++;
returnColSizes[returnLen] = 2;
returnNums[returnLen] = malloc(sizeof(int) * 2);
returnNums[returnLen][0] = build_end;returnNums[returnLen][1] = 0;
returnLen++;
build_start = buildings[i][0];
build_end = buildings[i][1];
build_heigh = buildings[i][2];
}else{
}
}
returnColSizes[returnLen] = 2;
returnNums[returnLen] = malloc(sizeof(int) * 2);
returnNums[returnLen][0] = build_start;returnNums[returnLen][1] = build_heigh;
returnLen++;
returnColSizes[returnLen] = 2;
returnNums[returnLen] = malloc(sizeof(int) * 2);
returnNums[returnLen][0] = build_end;returnNums[returnLen][1] = 0;
returnLen++;
for(i=0,j=0;i<returnLen;i++){
if(returnNums[i][1] != returnNums[j][1]){
j++;
returnNums[j][0] = returnNums[i][0];
returnNums[j][1] = returnNums[i][1];
}
}
returnLen = j+1;
*returnSize = returnLen;
*returnColumnSizes = returnColSizes;
return returnNums;
}