优先队列
描述
给定一个数组,找出其中最小的K个数。例如数组元素是4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。
0 <= k <= input.length <= 10000
0 <= input[i] <= 10000
示例1
11111111111111111
输入:
[4,5,1,6,2,7,3,8],4
返回值:
[1,2,3,4]
说明:
返回最小的4个数即可,返回[1,3,2,4]也可以
示例2
222222222222222222
输入:
[1],0
返回值:
[]
示例3
3333333333333333
输入:
[0,1,2,1,2],3
返回值:
[0,1,1]
摘自牛客的题目
很简单的一个题目嘛,但是为什么额。。。可能是大神们追求极限的速度,自己手写的堆。我这里就用STL了,
首先来看一下最大堆最小堆在c++中如何的定义:
参考自:
别人的文章
#include<stdio.h>
#include<queue>
#include<vector>
using namespace std;
//重载运算符(),自定义优先级1
struct cmp1{
bool operator ()(int &a,int &b){
return a>b;//最小值优先
}
};
struct cmp2{
bool operator ()(int &a,int &b){
return a<b;//最大值优先
}
};
//重载运算符<,自定义优先级2
struct number1{
int x;
bool operator < (const number1 &a) const {
return x>a.x;//最小值优先
}
};
struct number2{
int x;
bool operator < (const number2 &a) const {
return x<a.x;//最大值优先
}
};
int main()
{
priority_queue<int>que;//默认认优先级,从小到大
priority_queue<int,vector<int>,cmp1>que1;//最小值优先
priority_queue<int,vector<int>,cmp2>que2;//最大值优先
priority_queue<number1>que3; // 最小值优先
priority_queue<number2>que4; //最大值优先
return 0;
}
这个题目,就把数组元素依次push进优先队列就行了,然后取前k个
class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
vector<int> ans;
priority_queue<int, vector<int>, greater<int> > que;
for ( int i = 0; i < input.size(); ++i ) {
que.push(input[i]);
}
int i = 0;
while ( i < k ) {
ans.push_back(que.top());
que.pop();
++i;
}
return ans;
}
};
java版本:
java中自定义最大最小堆
java自定义最大最小堆
import java.util.ArrayList;
import java.util.PriorityQueue;
import java.util.Queue;
public class Solution {
public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {
ArrayList<Integer> ans = new ArrayList<Integer>();
if(k > input.length || input == null || input.length == 0 || k == 0)
return ans;
Queue<Integer> qu = new PriorityQueue<>(k);
for ( int item : input ) {
qu.add(item);
}
for ( int i = 0; i < k; ++i ) {
ans.add(qu.poll());
}
return ans;
}
}