博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
剑指offer——面试题30:最小的K个数
阅读量:2254 次
发布时间:2019-05-09

本文共 2637 字,大约阅读时间需要 8 分钟。

剑指offer——面试题30:最小的K个数

Solution1:

菜鸟做法,排序后挑选前k个数。复杂度为 O(nlogn) O ( n l o g n )

排序可以自己手撸快排代码,或者利用库函数sort(),这里为了省劲就用sort()了。。。

class Solution {public:    vector
GetLeastNumbers_Solution(vector
input, int k) { vector
res; int n = input.size(); if (n < k) return res; else { sort(input.begin(),input.end()); for(int i = 0; i < k; i++) res.push_back(input[i]); return res; } }};

Solution2:

利用快排中Partition()函数,时间复杂度 O(n) O ( n ) ,这种思路的限制是需要修改输入的数组。

20180904重做。

class Solution {public:    vector
GetLeastNumbers_Solution(vector
input, int k) { if (!k || k < 0 || input.size() < k) return {}; int start = 0, end = input.size() - 1; int index = Partition(input, start, end); while (index != k - 1) { if (index < k - 1) { start = index + 1; index = Partition(input, start, end); } else if (index > k - 1) { end = index - 1; index = Partition(input, start, end); } } return vector
(input.begin(), input.begin() + k); } int Partition(vector
&input, int begin, int end) { if (begin >= end) return begin; int refer = input[end]; int tail = begin; //tail是返回的索引 for (int i = begin; i < end; i++) { if (input[i] <= refer) my_swap(input, i, tail++); } my_swap(input, tail, end); return tail; } void my_swap(vector
&input, int i, int j) { int temp = input[i]; input[i] = input[j]; input[j] = temp; return; }};

Solution3:

利用最大堆,时间复杂度 O(nlogk) O ( n l o g k ) ,特别适合处理海量数据。但最大堆实现起来很麻烦。可以利用C++中的set和multiset,这俩容器是基于红黑树实现,在红黑树中的插入、删除和查找也是只需要 O(logk) O ( l o g k ) 的时间,代码如下:

这个好处是不需要改变原始数组内容。

class Solution {public:    vector
GetLeastNumbers_Solution(vector
input, int k) { vector
result; if (input.empty() || k<1 || input.size() < k) return result; multiset
insert_set;//重复的元素也可以同时返回多个 for (int i = 0; i < input.size(); i++) { if (i < k) { insert_set.insert(input[i]); } else { auto rit = insert_set.rbegin(); if (input[i] < *rit){ insert_set.erase(*rit); insert_set.insert(input[i]); } } } return vector
(insert_set.begin(), insert_set.end()); }};

转载地址:http://pxhdb.baihongyu.com/

你可能感兴趣的文章
Python-RabbitMQ消息队列
查看>>
Python-RabbitMQ消息队列实现rpc
查看>>
PHP-错误处理
查看>>
Python模块-subprocess模块
查看>>
PHP-上传文件
查看>>
Nmap几个常用的参数
查看>>
“百度杯”CTF比赛 九月场
查看>>
C Primer Plus学习笔记(一)- C语言概述
查看>>
Python-集合
查看>>
Python(算法)-时间复杂度和空间复杂度
查看>>
Python-使用unrar库时Couldn't find path to unrar library的解决办法
查看>>
Flash 零日漏洞复现(CVE-2018-4878)
查看>>
“百度杯”CTF比赛 十一月场(Misc)
查看>>
PHP-异常处理
查看>>
2016全国大学生信息安全竞赛(Misc)
查看>>
PHP-操作Mysql
查看>>
新版本Ubuntu本地提权漏洞复现
查看>>
Ettercap进行arp毒化
查看>>
第三届“百越杯”福建省高校网络空间安全大赛
查看>>
C Primer Plus学习笔记(二)- 数据和C
查看>>