题解 | #查找第K小数#
查找第K小数
https://www.nowcoder.com/practice/204dfa6fcbc8478f993d23f693189ffd
采用优先队列,元素乘-1再入队,取巧地在优先队列默认大根堆的情况下实现了小根堆,最后别忘乘回来-1即可。
第k小,但相同的元素算同1个,也就是只有所有相同元素都从优先队列pop出去后,才i++。
#include <queue> #include <cstdio> #include <iostream> using namespace std; int main(){ int n; while(scanf("%d",&n)!=EOF){ priority_queue<int> myPriorityQueue; for(int i = 0;i<n;i++){ int num; cin>>num; myPriorityQueue.push(num*(-1)); } int k; cin>>k; for(int i = 0;i<k-1;){//把第k小之前的都出队 //但是要实现相同大小算一样大,所以要前后比较,分情况讨论 int curnum1 = myPriorityQueue.top(); myPriorityQueue.pop(); int curnum2 = myPriorityQueue.top(); if(curnum1 == curnum2){ //如果当前top出的元素与下一个队首元素=,则i不增加 continue; } else{ //只有当当前top出的元素已经是与它相同的最后一个,再i++ i++; } } int answer = myPriorityQueue.top()*(-1); printf("%d\n",answer); } }