题解 | #最小的K个数#
最小的K个数
https://www.nowcoder.com/practice/6a296eb82cf844ca8539b57c23e6e9bf
class Solution { void maxHeapify(vector<int>& heap, int index) { /* 将指定的index视为根节点,对heap中index以后的部分的树进行最大堆化 */ int left = 2 * index + 1; int right = 2 * index + 2; int largest = index; if (left < heap.size() && heap[largest] < heap[left]) { largest = left; } if (right < heap.size() && heap[largest] < heap[right]) { largest = right; } if (largest != index) { swap(heap[index], heap[largest]); // largest是左或右节点的索引,交换两个元素的位置 maxHeapify(heap, largest); // 再以左或右节点为堆顶,维持其子树的最小堆性质 } vector<int> buildMaxHeap_knums(vector<int>& heap, int k) { /* 由heap构建最大堆,返回整个最大堆的前k个元素 */ for (int i = (heap.size() - 1) / 2; i >= 0; i--) { maxHeapify(heap, i); // 从最大堆的底部往上进行堆化 } vector<int> result(heap.begin(), heap.begin() + k); return result; } public: vector<int> GetLeastNumbers_Solution(vector<int>& input, int k) { vector<int> resultVec; if (input.size() == 0 || k == 0) { return resultVec; } if (input.size() <= k) { return input; } resultVec = buildMaxHeap_knums(input, k); for (int i = k; i < input.size(); i++) { if (resultVec[0] > input[i]) { resultVec[0] = input[i]; maxHeapify(resultVec, 0); } } std::reverse(resultVec.begin(), resultVec.end()); return resultVec; } };