218. 天际线问题 The Skyline Problem

题目 <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;
}

猜你喜欢

转载自blog.csdn.net/ZRXSLYG/article/details/112252642