在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
示例 1:
输入: [3,2,1,5,6,4] 和
k = 2
输出: 5
示例 2:
输入: [3,2,3,1,2,4,5,5,6] 和
k = 4
输出: 4
说明:
你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。
最粗暴的方式是对所有的数据排序,然后取出第k个数;但是对进行很多不必要的排序;
这里用快速排序,和二分的思想来找第k大的数据;
以第一个数为pivot,找到该数在有序序列中的位置, 如果该数的位置在k的左边,就在该数的右边继续查找, 如果该数在k的右边, 就在该数的左边继续查找
1 class Solution { 2 public: 3 int partition(vector<int>& num, int low, int high){ 4 int pivot = num[low]; 5 while(low<high){ 6 while(low<high && num[high]<=pivot) --high; 7 swap(num[low], num[high]); 8 while(low<high && num[low]>=pivot) ++low; 9 swap(num[low], num[high]); 10 } 11 return low; 12 } 13 int findKthLargest(vector<int>& nums, int k) { 14 int l=0, r=nums.size()-1; 15 while(true){ 16 int pos=partition(nums, l, r); 17 if(pos>k-1) r=pos-1; 18 if(pos<k-1) l=pos+1; 19 if(pos==k-1) return nums[k-1]; 20 } 21 } 22 };
还能用heap排序来找,堆排序不是很熟悉,以后再做