top k 问题
来源:互联网 发布:人依赖网络例子 编辑:程序博客网 时间:2024/06/05 00:32
top k 问题;
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
[牛客url]https://www.nowcoder.com/practice/6a296eb82cf844ca8539b57c23e6e9bf?tpId=13&tqId=11182&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking
// 解法1 全排序 时间复杂度O(nlogn)
class Solution {public: vector<int> GetLeastNumbers_Solution(vector<int> input, int k) { vector<int> res; if(input.empty()||k>input.size()) return res; sort(input.begin(),input.end()); for(int i=0;i<k;i++) res.push_back(input[i]); return res; }};
解法2:最大堆
注意:当输出前几个小的数时维持最大堆,反之最小堆
//利用STL里面的multiset,维持一个集合//set中按照仿函数中的greater<T>模板,从大到小排序class Solution {public: // top k 问题 解2 vector<int> GetLeastNumbers_Solution(vector<int> input, int k) { vector<int> res; if(input.size() == 0 || input.size() < k) return res; set<int,greater<int> > intSet; // 维持一个最大堆 for(auto iter = input.begin();iter != input.end(); ++ iter){ if ((intSet.size()) < k) intSet.insert(*iter); else { //第一个元素是最大值 auto itBegin = intSet.begin(); if (*(intSet.begin() ) > *iter ){ //先在set中删除后插入 intSet.erase(itBegin); intSet.insert(*iter); } } } auto itBeg = intSet.begin(); //使其从小到大输出 for (int i = 0; i < k; i++){ res.push_back( *itBeg ++); } return res; }};
解法3:Partiton思想 时间复杂度O(n)
class Solution {public: int Partition(vector<int>& input, int begin, int end) { int low=begin; int high=end - 1; int pivot=input[end]; while(low<high) { while(low<high&&pivot<=input[high]) high--; while(low<high&&pivot>=input[low]) low++; if(low <= high){ swap(input[high],input[low]); high --; low ++; } else break; } swap(input[low],input[end]); // 注意交换的是low和end的值,不能是high return low; } vector<int> GetLeastNumbers_Solution(vector<int> input, int k) { int len=input.size(); if(len==0||k>len) return vector<int>(); if(len==k) return input; int start=0; int end=len-1; int index=Partition(input,start,end); while(index!=(k-1) && k >0) //注意判断k是否大于0,否则死循环 { if(index>k-1) index=Partition(input,start,index-1); else index=Partition(input,index+1,end); } vector<int> res(input.begin(), input.begin() + k); return res; }};
阅读全文
0 0
- TOP K问题
- TOP K问题
- Top K问题
- top K 问题
- Top K问题
- TOP K问题
- Top K问题
- top-K问题详解
- top k问题
- Top K问题
- Top K问题
- TOP K算法问题
- top K问题
- Top K 问题
- top K问题
- 一个 Top k 问题
- top k 问题
- 04Top K算法问题
- 英雄联盟与人生奋斗的类比讨论
- 如何在微信公众号调用图灵机器人
- 浅析JBPM工作流引擎
- Mybatis实战 之 获取主键
- 人生
- top k 问题
- 庆功会(动态规划练习题)
- CEOI2004锯木厂选址
- sysbench 安装
- HNOI2008玩具装箱
- 观察者设计模式
- EasyDemo*五大布局体系结构图(on Github)
- 修改系统默认的TTL值-预防被探测操作系统
- USACO08MAR Land Acquisition