leetcode第几题忘了,这是在做华为的工作级demo题:
另外我记得有大神说过,凡是这种数对的,涉及排序的,要么就是第一正序,第二降序,要么就是第一降序第二正序。记录一下!!!
这个就是第一降序,第二正序。先按照从大到小的排,然后依次插入。后面要插入的,前面就是所有比他大的。
代码:
/*
* 输入**people是长度为peopleSize的数组指针的数组,其中每个元素(也是一个数组)
* 的长度组成 *peopleColSize数组作为另一输入,*peopleColSize数组的长度也为peopleSize
* 返回为 *returnSize大小的数组指针的数组,其中每个元素(也是一个数组)的长度组成 *returnColumnSizes数组返回,*returnColumnSizes数组的长度也为 *returnSize。
*
* 注意:返回的数组以及其数组元素和 *returnColumnSizes数组都必须在给定的函数内进行内存分配,由框架代码进行内存释放。
*/
int cmp(const void *a,const void *b){
int _a=(*(int**)a)[0];
int _b=(*(int**)b)[0];
if(_a==_b){
return (*(int**)a)[1]-(*(int**)b)[1];
}else{
return _b-_a;
}
}
int** ReconstructQueue(int** people, int peopleSize, int* peopleColSize, int* returnSize, int** returnColumnSizes)
{
int **res=(int**)malloc((peopleSize+2)*sizeof(int*));
*returnColumnSizes=malloc(sizeof(int*)*peopleSize);
for(int i=0;i<peopleSize;i++){
res[i]=(int*)malloc(2*sizeof(int));
(*returnColumnSizes)[i]=2;
}
qsort(people,peopleSize,sizeof(people),cmp);
*returnSize=peopleSize;
int k=0;
int t=0;
while(k<peopleSize){
if(people[t][1]>= k){
res[k]=people[t];
k++;
t++;
}else{
for(int i=k;i>people[t][1];i--){
res[i]=res[i-1];
}
res[people[t][1]]=people[t];
k++;
t++;
}
}
return res;
}