最小的k个数
来源:互联网 发布:淘宝企业店铺装修教程 编辑:程序博客网 时间:2024/05/29 08:47
题目描述
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
/*方法一:库函数sort排序,内部综合了多种排序方法,时间复杂度为nlogn*/class Solution {public: vector<int> GetLeastNumbers_Solution(vector<int> input, int k) { vector<int> res; if(k<0||k>input.size()) return res; sort(input.begin(),input.end()); for(int i=0; i<k; ++i) res.push_back(input[i]); return res; }};/*方法二:partition思想,即快速排序方法,第一次为n,第二次为2/n,往后为3/n,4/n...,求和得时间复杂度为2n,即O(N)的复杂度*//*此处的前k个数字并未排序,若要排序输出,则要进行完整的快速排序或者对前k个数排个序*/class Solution {public: int Partition(vector<int>& input, int begin, int end) { int low=begin; int high=end; int pivot=input[low]; while(low<high) { while(low<high&&pivot<=input[high]) high--; input[low]=input[high]; while(low<high&&pivot>=input[low]) low++; input[high]=input[low]; } input[low]=pivot; return low; } vector<int> GetLeastNumbers_Solution(vector<int> input, int k) { int len=input.size(); vector<int> res; if(len<=0||k>len||k<=0) return res; int start=0; int end=len-1; int index=Partition(input,start,end); while(index!=(k-1)) { if(index>k-1) { end=index-1; index=Partition(input,start,end); } else { start=index+1; index=Partition(input,start,end); } } for(int i=0; i<k; ++i) res.push_back(input[i]); return res; } };/*方法三:构建最大堆,时间复杂度为nlogk*/class Solution {public: vector<int> GetLeastNumbers_Solution(vector<int> input, int k) { int len=input.size(); vector<int> res; if(len<=0||k>len||k<=0) return res; for(int i=0; i<k; ++i) { res.push_back(input[i]); } make_heap(res.begin(),res.end()); for(int i=k; i<len; ++i) { if(res[0]>input[i]) { pop_heap(res.begin(),res.end()); res.pop_back(); res.push_back(input[i]); push_heap(res.begin(),res.end()); } } return res; }};/*方法四:multiset存储,底层红黑树实现,时间复杂度为nlongk*/class Solution {public: vector<int> GetLeastNumbers_Solution(vector<int> input, int k) { int len=input.size(); if(len<=0||k>len) return vector<int>(); //仿函数中的greater<T>模板,从大到小排序 multiset<int, greater<int> > leastNums; vector<int>::iterator vec_it=input.begin(); for(;vec_it!=input.end();vec_it++) { //将前k个元素插入集合 if(leastNums.size()<k) leastNums.insert(*vec_it); else { //第一个元素是最大值 multiset<int, greater<int> >::iterator greatest_it=leastNums.begin(); //如果后续元素<第一个元素,删除第一个,加入当前元素 if(*vec_it<*(leastNums.begin())) { leastNums.erase(greatest_it); leastNums.insert(*vec_it); } } } return vector<int>(leastNums.begin(),leastNums.end()); }};
阅读全文
0 0
- 最小的K个数
- 最小的K个数
- 最小的K个数
- 最小的k个数
- 最小的k个数
- 最小的k个数
- 最小的k个数
- 最小的k个数
- 最小的k个数
- 最小的K个数
- 最小的k个数
- 最小的K个数
- 最小的K个数
- 最小的K个数
- 最小的K个数
- 最小的K个数
- 最小的k个数
- 最小的k个数
- Cg Programming/Unity/Silhouette Enhancement轮廓增强
- 例题7-1 除法(Division, UVa 725)
- bzoj3862Little Devil I(树链剖分+线段树)
- 使用scala计算两个Gps点之间的距离
- 找到几个在线查看函数图像的网站
- 最小的k个数
- BZOJ 3991 寻宝游戏 (dfs序 RMQ set维护动态链的并集)
- uvalive 2966 求一个二分图 所有的完美匹配
- 多分支语句中的跳楼现象
- TCL学习笔记之 列表命令
- JAVA jvm和 Android dvm的区别
- 深度揭秘原型(深浅克隆)模式!
- 018 连续函数的运算及初等函数的连续性;第一类间断点、第二类间断点
- HNU OJ题库 1007H生理周期