【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;
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值