题目:输入n个整数,输出其中最小的k个。
例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。
(当然:涉及真正工程项目不会这样”就事论事“,还要看为什么要找其中最小K个?这K个需不需要排序了?以后会不会变成找最大K个?等问题,要考虑到业务原因。直接给它用O(nlogn)排序好了!)
思路:就遍历一遍这n个数,每次尝试放入容量为k的优先队列中。不知道这个复杂度怎么算?貌似维护一个长度为k的优先队列复杂度是O(klogk)吗?这样O(nklogk)比O(nlogn)优吗?!不知道 :(
#include <stdio.h> #include <queue> using namespace std; void findSmallestK(int* arr, int len, int k){ priority_queue<int> pq; int i; for(i=0;i<len;i++){ if(pq.size()>=k){ if(pq.top()>arr[i]){ pq.pop(); pq.push(arr[i]); } }else{ pq.push(arr[i]); } } while(!pq.empty()){ printf("%d ",pq.top()); pq.pop(); } } int main(){ int arr[]={1,2,3,4,5,6,7,8}; findSmallestK(arr,8,4); return 0; }