TopK问题(C++)

topk问题是问的比较多的问题,给定一个数组,求出最大的前K个数。

1.排序 最符合直觉的就是先排序,再直接输出排好序的前K个元素(排序时应从大到小排)


template
auto topk(vector arr, int k) {
        if (k > arr.size()) return arr;
	sort(arr.begin(), arr.end(), [](auto left, auto right) { return right < left; });
	return vector(arr.begin(), arr.begin() + k);
}

2.使用大根堆

先建立大根堆 然后不断输出头部元素即可

//调整第k个节点代表的子堆,使之成为大根堆
template
void adjust(vector& 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
void buildMaxHeap(vector& arr) {
	for (int i =

你可能感兴趣的:(Algorithm,C++,topk)