【C语言刷LeetCode】406. 根据身高重建队列(M)

假设有打乱顺序的一群人站成一个队列。 每个人由一个整数对(h, k)表示,其中h是这个人的身高,k是排在这个人前面且身高大于或等于h的人数。 编写一个算法来重建这个队列。

注意:
总人数少于1100人。

示例

输入:
[[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]]

输出:
[[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/queue-reconstruction-by-height
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

见到数组考虑是否排序,排序就直接选择qsort.

此题也是先排序,但有点特殊的是二维数组qsort排序,comp函数如何写要理解记住。

接着就是数组的插入操作,同 ‘315. 计算右侧小于当前元素的个数(H)’题,C语言很容易在这里卡死。

此题思想就是先按照身高降序(身高相同按k升序),然后根据根据k值选择插入位置。

当然一如既往的要注意C语言内存申请,returnColumnSizes的处理,此处较恶心,多做几道类似的就习惯了,谁叫你用C语言刷题呢。

void insert(int** people, int size, int *toBeInserted, int index)
{
    int i = size;
    
    while (i > index) {
        people[i] = people[i-1];
        i--;
    }

    people[index] = toBeInserted;
}

int Comp(void const *a, void const *b) {
    int *onea = *(int **)a;
    int *oneb = *(int **)b;
    
    if (onea[0] == oneb[0]) {
        return (onea[1] - oneb[1]);
    }
    
    return (oneb[0] - onea[0]);
}

int** reconstructQueue(int** people, int peopleSize, int* peopleColSize, int* returnSize, int** returnColumnSizes)
{
    int i;
    int **retarr;
    
    retarr = (int **)malloc(sizeof(int *) * peopleSize);
    returnColumnSizes[0] = (int *)malloc(sizeof(int) * peopleSize);
    
    for (i = 0; i < peopleSize; i++) {
        retarr[i] = (int *)malloc(sizeof(int) * 2);
        returnColumnSizes[0][i] = 2;
        memset(retarr[i], 0, sizeof(int) * 2);
    }
    
    qsort(people, peopleSize, sizeof(people[0]), Comp);
    
    for (i = 0; i < peopleSize; i++) {
        insert(retarr, i, people[i], people[i][1]);
    }
    
    *returnSize = peopleSize;
    
    return retarr;
}
发布了140 篇原创文章 · 获赞 17 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/jin615567975/article/details/104416311