在数组中找到第k大的元素
注意事项
你可以交换数组中的元素的位置
样例
给出数组 [9,3,2,4,8]
,第三大的元素是 4
给出数组 [1,2,3,4,5]
,第一大的元素是 5
,第二大的元素是 4
,第三大的元素是 3
,以此类推
堆排序:
建立大小为k的小顶堆,输出nums[0]
void makeHeap(vector<int> &nums,int k,int n) { int i = k; int j = 2 * i + 1; int temp = nums[i]; while(j < n) { if(j < n - 1 && nums[j] > nums[j + 1])j++; if(temp < nums[j])break; else { nums[i] = nums[j]; i = j; j = 2 * j + 1; } } nums[i] = temp; } void initHeap(vector<int> &nums,int n) { for(int i = (n - 2) / 2;i >= 0;i--) { makeHeap(nums,i,n); } } int kthLargestElement(int k, vector<int> nums) { // write your code here int n = nums.size(); if(k > n)return -1; initHeap(nums,k); for(int i = k;i < n;i++) { if(nums[i] > nums[0]) { int tmp = nums[i]; nums[i] = nums[0]; nums[0] = tmp; makeHeap(nums,0,k); } } return nums[0]; }
快排:
从大到小排列,输出nums[k - 1]
int parition(vector<int> &nums,int low,int high) { int i = low; int j = high; int temp = nums[i]; while(i < j) { while(i < j && nums[j] <= temp)j--; if(i < j ) { nums[i++] = nums[j]; } while(i < j && nums[i] > temp)i++; if(i < j) { nums[j--] = nums[i]; } } nums[i] = temp; return i; } int kthLargestElement(int k, vector<int> nums) { // write your code here int n = nums.size(); if(k > n)return -1; int i = 0; int j = n -1; while(1) { int qqq = parition(nums,i,j); if(qqq == k - 1)return nums[k - 1]; else if(qqq < k -1) { i = qqq + 1; } else j = qqq - 1; } return -1; }