215. 数组中的第K个最大元素

在未排序的数组中找到第 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排序来找,堆排序不是很熟悉,以后再做

有疑惑或者更好的解决方法的朋友,可以联系我,大家一起探讨。qq:1546431565
原文地址:https://www.cnblogs.com/mr-stn/p/9201693.html