class Solution { public: vector<int> heap; //堆:每个根节点大于(小于)左右子节点,形成大根堆(小根堆), void down_go(int start){ //向下调整 int smallest = start; int L = smallest*2 +1; int R = smallest*2 +2; if(L<heap.size() && heap[smallest] > heap[L]) smallest = L; if(R<heap.size() && heap[smallest] > heap[R]) smallest = R; if(smallest != start){ //维护根节点最小 swap(heap[smallest], heap[start]); down_go(smallest); //向下递归 } } void up_go(int start){ //加入新元素,向上调整 //while(start){ int father = (start-1)/2; if(heap[father] > heap[start]){ swap(heap[father], heap[start]); start = father; up_go(start); //只用调整新加入的节点和父节点的关系; } //else{ // break; //} //} } int findKth(vector<int>& a, int n, int K) { // write code here for(int i=0; i<n; ++i){ if(heap.size()< K){ heap.push_back(a[i]); up_go(i); }else{ if(a[i] > heap[0]){ heap[0] = a[i]; down_go(0); } } } return heap[0]; } };