Leetcode406. 根据身高重建队列(C语言)

Leetcode406. 根据身高重建队列(C语言)

算法-贪心思想:算法与数据结构参考

题目:
假设有打乱顺序的一群人站成一个队列。 每个人由一个整数对(h, k)表示,其中h是这个人的身高,k是排在这个人前面且身高大于或等于h的人数。 编写一个算法来重建这个队列。例:
输入:[[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]]
输出:[[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]]

思路:
先按身高从小到大排序,在按照前面的人数进行插入。
元素对应的位置(若构造数组,注意初始化的处理):
people[i]所在的位置 = 其前面的空位数量 + people[i][0]的数量

参考力扣大佬

代码:

int compare(int **a,int **b){
    return (*(int**)a)[0]-(*(int**)b)[0];
}

int** reconstructQueue(int** people, int peopleSize, int* peopleColSize, int* returnSize, int** returnColumnSizes){
    int ** r= (int **)malloc(peopleSize * sizeof(int *));
    for(int i = 0; i < peopleSize; i++) {
        r[i] = (int *)malloc(sizeof(int) * peopleColSize[i]);
        memset(r[i], -1, sizeof(int) * peopleColSize[i]);	//每个第一维数初始化-1
    }	//二维数组中第一维初始化

    qsort(people, peopleSize, sizeof(int *), compare);

    for (int i = 0; i < peopleSize; i++) {
        int index = people[i][1] + 1;	
        		//记录people[i]位置=空位数量 + people[i][0]
        for (int j = 0; j < peopleSize; j++) {	//循环peopleSize次,每一次i插入到最终位置
            if ((r[j][0] == -1 || r[j][0] == people[i][0]) && (--index == 0)) {
            	//r中第一维没移动过,在所在位置插入people
                    r[j][0] = people[i][0];
                    r[j][1] = people[i][1];
                    break;
            }
        }
    }

    *returnSize = peopleSize;      // 处理返回值
    *returnColumnSizes = peopleColSize;	
    
    return r;
}

你可能感兴趣的:(数据结构&算法)