题目描述

下面介绍三种方法
一、暴力法
class Solution {
public:
vector<int> getLeastNumbers(vector<int>& arr, int k) {
sort(arr.begin(),arr.end(), less<int>());
vector<int> res(arr.begin(),arr.begin()+k);
return res;
}
};
二、快排划分思想
class Solution {
public:
int partition(vector<int> &arr, int low, int high){
int value = arr[low];
while(low < high){
//注意这里必须加等号,否则arr[low]==arr[high] 且 arr[low]==value会有死循环
while(arr[high]>=value && low<high) high--;
arr[low] = arr[high];
while(arr[low]<=value && low<high) low++;
arr[high] = arr[low];
}
arr[low] = value;
return low;
}
vector<int> getLeastNumbers(vector<int>& arr, int k) {
if(k == 0) return vector<int>();
else if(k >= arr.size()) return arr;
else{
int low = 0;
int high = arr.size() - 1;
int index = partition(arr, low, high);
while(index != k-1){
if(index < k-1) low = index + 1;
else high = index - 1;
index = partition(arr, low, high);
}
return vector<int> (arr.begin(), arr.begin()+k);
}
}
};
三、优先级队列
优先级队列本质是通过堆实现的
- less 表示大顶堆
- greater 表示小顶堆
class Solution {
public:
vector<int> getLeastNumbers(vector<int>& arr, int k) {
vector<int> res(k);
priority_queue<int,vector<int>,less<int>> q;
for(int i=0;i<arr.size();i++){
q.push(arr[i]);
if(q.size()>k) q.pop();
}
for(int i=k-1;i>=0;i--){
res[i]=q.top();
q.pop();
}
return res;
}
};
四、堆排序
堆排序详解
















