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