topk问题是问的比较多的问题,给定一个数组,求出最大的前K个数。
1.排序 最符合直觉的就是先排序,再直接输出排好序的前K个元素(排序时应从大到小排)
template<class T>
auto topk(vector<T> arr, int k) {
if (k > arr.size()) return arr;
sort(arr.begin(), arr.end(), [](auto left, auto right) { return right < left; });
return vector<T>(arr.begin(), arr.begin() + k);
}
2.使用大根堆
先建立大根堆 然后不断输出头部元素即可
//调整第k个节点代表的子堆,使之成为大根堆
template<class T>
void adjust(vector<T>& arr, int k,int len) {
while (true) {
int temp = 2 * k + 1;
if (temp >= len) break;
if (temp + 1 < len && arr[temp + 1] > arr[temp])
temp++;
if (arr[temp] <= arr[k]) break;
else{
std::swap(arr[temp], arr[k]);
k = temp;
}
}
}
//建立大根堆
template<class T>
void buildMaxHeap(vector<T>& arr) {
for (int i =