方法一:排序后选取K个数
class Solution {
public:
vector<int> getLeastNumbers(vector<int>& arr, int k) {
vector<int> result;
if( k > arr.size() || k <= 0)
return result;
sort(arr.begin(),arr.end());
result.assign(arr.begin(), arr.begin() + k);
return result;
}
};
方法二:快速排序实现
方法三:小顶堆实现
class Solution {
public:
vector<int> getLeastNumbers(vector<int>& arr, int k) {
vector<int> result;
if( k > arr.size())
return result;
if( k == 0)
return result;
//创建大顶堆
priority_queue<int, vector<int> > q;
for( int i = 0; i < k; i++)
{
q.push( arr[i] );
}
for( int i = k ; i < arr.size(); i++ )
{
if( arr[i] < q.top() )
{
q.pop();
q.push(arr[i]);
}
}
while( !q.empty() )
{
result.push_back( q.top() );
q.pop();
}
return result;
}
};
附:C++中priority_queue适用方法
作为队列的一个延伸,priority_queue优先队列包含在头文件< queue >中。
优先队列时一种比较重要的数据结构,它是有二项队列编写而成的,可以以O(log n) 的效率查找一个队列中的最大值或者最小值,其中是最大值还是最小值是根据创建的优先队列的性质来决定的。
模版参数
priority_queue< type, container, function >
- type:数据类型;
- container:实现优先队列的底层容器;
- function:元素之间的比较方式;(优先队列默认是最大堆,每次堆顶元素时堆中的最大元素)
构造大顶堆与小顶堆
- 大顶堆(默认构造大顶堆)
//构造一个空的优先队列(此优先队列默认为大顶堆)
priority_queue<int> big_heap;
//另一种构建大顶堆的方法
priority_queue<int,vector<int>,less<int> > big_heap2;
- 小顶堆
//构造一个空的优先队列,此优先队列是一个小顶堆
priority_queue<int,vector<int>,greater<int> > small_heap;
小顶堆:
#include <iostream>
#include <queue>
#include <functional>
using namespace std;
int main()
{
priority_queue <int,vector<int> , greater<int> > big_heap;
big_heap.push(3);
big_heap.push(6);
big_heap.push(1);
while( big_heap.size() != 0 )
{
cout << big_heap.top() << endl;
big_heap.pop();
}
system("pause");
return 0;
}
结果: