leetcode 703. Kth Largest Element in a Stream (c语言)

本文介绍了一种设计类的方法,该类可以找到数据流中的第K大数。通过接收整数K和数组nums作为参数,每次调用add方法添加新数时,都能返回当前数据流中第K大的元素。文章提供了详细的实现思路和C语言代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接 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;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值