题解 | #寻找第K大#

寻找第K大

http://www.nowcoder.com/practice/e016ad9b7f0b45048c58a9f27ba618bf

思路

本题是一个排序问题,可选的排序方案很多,其中冒泡、选择等O(n^2)时间的排序方案代价较高,选用快排、堆排、分治算法是比较省时的方案。直接调用c++内置sort函数是最好的办法。

###方法一:调用sort函数排序

class Solution {
public:
    static bool cmp(const int& a, const int& b) {    // 设定比较规则,大数靠前
        return a > b;
    }
    
    int findKth(vector<int> a, int n, int K) {       
        // write code here
        sort(a.begin(), a.end(), cmp);                // 将原数组重新排序
        return a[K-1];                                // 返回第k大的数字
    }
};

####复杂度分析

  • 时间复杂度:O(NlogN),排序时间
  • 空间复杂度:O(logN),sort函数内部机制包含快速排序算法的思想,因此空间复杂度和快排的空间代价相关。

###方法二:堆排序 使用最大堆的方案来进行排序也是很好的方案,这是求k大或k小的数字常用方法

图片说明

class Solution {
public:
    int findKth(vector<int> a, int n, int K) {
        // write code here
        vector<int>::iterator iter;
        int i = 0;
        for(iter = a.begin(); K > 1; K--){
            make_heap(iter, a.end(), less<int>());    // 构建最大堆
            iter++;                                   // 每构建一次调整一次起始构建位置
        }
        make_heap(iter, a.end(), less<int>());        // 由于最后执行了一次iter++,还需要再构建一次最大堆
        return *iter;
    }
};

####复杂度分析

  • 时间复杂度:O(KlogN),构建一次最大堆O(logN),访问K次,比整体排序时间更短
  • 空间复杂度:O(1),没有额外空间申请
不会做题写的题解 文章被收录于专栏

哎呀我好笨呀,一不小心又不会了一道题

全部评论
第一种使用快排,快排实际上是递归.也是有空间复杂度的
点赞 回复 分享
发布于 2022-01-21 23:27
c++的方法确实不错,但是必须特别对c++有了解,作为中级语言,c++的库函数还是不是很理解啊,另外今年408考研第二道大题就是这个题,但是没有要求给出代码,仅仅要求写出思路,降低了不少的难度
点赞 回复 分享
发布于 2022-01-12 10:49

相关推荐

06-17 00:26
门头沟学院 Java
程序员小白条:建议换下项目,智能 AI 旅游推荐平台:https://github.com/luoye6/vue3_tourism_frontend 智能 AI 校园二手交易平台:https://github.com/luoye6/vue3_trade_frontend GPT 智能图书馆:https://github.com/luoye6/Vue_BookManageSystem 选项目要选自己能掌握的,然后最好能自己拓展的,分布式这种尽量别去写,不然你只能背八股文了,另外实习的话要多投,尤其是学历不利的情况下,多找几段实习,最好公司title大一点的
无实习如何秋招上岸
点赞 评论 收藏
分享
06-13 17:33
门头沟学院 Java
顺序不记了,大致顺序是这样的,有的相同知识点写分开了1.基本数据类型2.基本数据类型和包装类型的区别3.==和equals区别4.ArrayList与LinkedList区别5.hashmap底层原理,put操作时会发生什么6.说出几种树型数据结构7.B树和B+树区别8.jvm加载类机制9.线程池核心参数10.创建线程池的几种方式11.callable与runnable区别12.线程池怎么回收线程13.redis三剑客14.布隆过滤器原理,不要背八股,说说真正使用时遇到了问题没有(我说没有,不知道该怎么回答了)15.堆的内存结构16.自己在写项目时有没有遇见过oom,如何处理,不要背八股,根据真实经验,我说不会17.redis死锁怎么办,watchdog机制如何发现是否锁过期18.如何避免redis红锁19.一个表性别与年龄如何加索引20.自己的项目的QPS怎么测的,有没有真正遇到大数量表21.说一说泛型22.springboot自动装配原理23.springmvc与springboot区别24.aop使用过嘛?动态代理与静态代理区别25.spring循环依赖怎么解决26.你说用过es,es如何分片,怎么存的数据,1000万条数据怎么写入库中27.你说用limit,那么在数据量大之后,如何优化28.rabbitmq如何批次发送,批量读取,答了延迟队列和线程池,都不对29.计网知不知道smtp协议,不知道写了对不对,完全听懵了30.springcloud知道嘛?只是了解反问1.做什么的?短信服务,信息量能到千万级2.对我的建议,基础不错,但是不要只背八股,多去实际开发中理解。面试官人不错,虽然没露脸,但是中间会引导我回答问题,不会的也只是说对我要求没那么高。面完问我在济宁生活有没有困难,最快什么时候到,让人事给我聊薪资了。下午人事打电话,问我27届的会不会跑路,还在想办法如何使我不跑路,不想扣我薪资等。之后我再联系吧,还挺想去的😭,我真不跑路哥😢附一张河科大幽默大专图,科大就是大专罢了
查看30道真题和解析
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-03 18:13
点赞 评论 收藏
分享
评论
8
3
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务