Find the kth largest element in an unsorted array. Note that it is the kth largest element in the sorted order, not the kth distinct element.
For example,
Given [3,2,1,5,6,4]
and k = 2, return 5.
思路:
堆。讲解:二叉堆
class Solution { public: //新插入i结点 其父节点为(i - 1) / 2 void MinHeapFixup(int a[], int i) { int j = (i - 1) / 2; //父节点 int temp = a[i]; while(j >= 0 && i != 0) { if(a[j] <= temp) break; a[i] = a[j]; i = j; j = (i - 1) / 2; } a[i] = temp; } //在最小堆中插入新数据nNum void MinHeapAddNumber(int a[], int n, int nNum) { a[n] = nNum; MinHeapFixup(a, n); } //堆删除后的调整 从i节点开始调整,n为节点总数 从0开始计算 i节点的子节点为 2*i+1, 2*i+2 void MinHeapFixdown(int a[], int i, int n) { int j = 2 * i + 1; int temp = a[i]; while(j < n) { if(j + 1 < n && a[j + 1] < a[j]) //在左右孩子中找最小的 j++; if(a[j] >= temp) break; a[i] = a[j]; //把较小的子结点往上移动,替换它的父结点 i = j; j = 2 * i + 1; } a[i] = temp; } //在最小堆中删除数 void MinHeapDeleteNumber(int a[], int n) { swap(a[0], a[n - 1]); MinHeapFixdown(a, 0, n - 1); } int findKthLargest(vector<int>& nums, int k) { int * a = new int[k]; //大小为k的最小堆 for(int i = 0; i < nums.size(); ++i) { if(i < k) { MinHeapAddNumber(a, i, nums[i]); //插入数据 } else if(nums[i] > a[0]) //比已有的k个最大的数字大 { MinHeapDeleteNumber(a, k); MinHeapAddNumber(a, k - 1, nums[i]); } } return a[0]; } };
用STL的堆:
int findKthLargest(vector<int>& nums, int k) { priority_queue<int> p; const int s(nums.size()); for (int i = 0; i < s; ++i) p.push(nums[i]); while (--k) p.pop(); return p.top(); }
堆的相关讲解: