题目链接 https://leetcode.com/problems/kth-largest-element-in-a-stream/
题目描述
设计一个类,这个类能够找到数据流中的第k大数。注意这个数是排序后的第k大数,不是第k个不同的数。
你的类需要能够接收整数k和一个数组nums,nums包含数据流中的初始元素,每次调用 KthLargest.add
,将添加一个新的数,并返回当前数据流中第K大的元素。
样例:
int k = 3; int[] arr = [4,5,8,2]; KthLargest kthLargest = new KthLargest(3, arr); kthLargest.add(3); // returns 4 kthLargest.add(5); // returns 5 kthLargest.add(10); // returns 5 kthLargest.add(9); // returns 8 kthLargest.add(4); // returns 8
思路:
先对输入数组进行排序,然后将数组写入链表中,之后每次插入新的数时,按序查找到对应的位置进行插入,然后遍历链表找到第k大的数即可。
代码
int cmp(const void*a,const void*b){
return *(int*)b-*(int*)a;
}
typedef struct KthLargest{
int k;
int val;
struct KthLargest *next;
} KthLargest;
KthLargest* kthLargestCreate(int k, int* nums, int numsSize) {
qsort(nums,numsSize,sizeof(int),cmp);
KthLargest *obj =(KthLargest *) malloc(sizeof(KthLargest));
obj->val = -1;
obj->k = k;
obj->next = NULL;
if(numsSize<1)
return obj;
KthLargest *tmp = obj;
for(int i=0;i<numsSize;i++)
{
KthLargest *t = (KthLargest *)malloc(sizeof(KthLargest));
tmp->next = t;
t->val = nums[i];
t->next = NULL;
tmp = t;
}
return obj;
}
int kthLargestAdd(KthLargest* obj, int val) {
KthLargest *t = (KthLargest *)malloc(sizeof(KthLargest));
t->val = val;
t->next = NULL;
KthLargest *tmp = obj;
if(tmp->next == NULL)
{
tmp->next =t;
return t->val;
}
while(tmp->next != NULL)
{
if(t->val > (tmp->next)->val)
{
t->next = tmp->next;
tmp->next = t;
break;
}
if(tmp->next->next == NULL&&tmp->next->val >= t->val)
{
tmp->next->next = t;
break;
}
tmp = tmp->next;
}
tmp = obj;
for(int i=0 ; i<obj->k ; i++)
{
tmp=tmp->next;
}
return tmp->val;
}
void kthLargestFree(KthLargest* obj) {
while(obj != NULL)
{
KthLargest *tmp = obj->next;
free(obj);
obj=tmp;
}
}