一、题目描述
Find the kth largest element in anunsorted 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.
Note:
You may assume k is always valid, 1 ≤ k ≤ array's length.
二、方法一
写法最简单的方法,调用sort函数从小到大排序,再输出数组的第n-k位,该方法的时间复杂度是O(nlogn)。
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
sort(nums.begin(),nums.end());
return nums[nums.size()-k];
}
};
三、方法二
对排序进行优化,分别用快排和堆排实现:
快排:
class Solution {
public:
int patition(vector<int>& nums,int left,int right){
int l=left+1,r=right;
while(l<=r){
if(nums[l]<nums[left]&&nums[r]>nums[left]){
swap(nums[l],nums[r]);
l++;
r--;
}
if(nums[l]>=nums[left]) l++;
if(nums[r]<=nums[left]) r--;
}
swap(nums[r],nums[left]);
return r;
}
int findKthLargest(vector<int>& nums, int k) {
int left=0,right=nums.size()-1;
while(true){
int pos = patition(nums,left,right);
if(pos==k-1) return nums[pos];
else if(pos>k-1) right=pos-1;
else left=pos+1;
}
}
};
堆排:
class Solution {
public:
void maxheap(vector<int>& nums,int index){
int large =index;
int left = index*2+1,right=index*2+2;
if(left<heapsize&&nums[large]<nums[left]) large=left;
if(right<heapsize&&nums[large]<nums[right]) large=right;
if(large!=index){
swap(nums[index],nums[large]);
maxheap(nums,large);
}
}
void buildheap(vector<int>& nums){
heapsize=nums.size();
for(int i=(heapsize/2-1);i>=0;i--)
maxheap(nums,i);
}
int findKthLargest(vector<int>& nums, int k) {
buildheap(nums);
heapsize=nums.size();
for(int i=0;i<k;i++){
swap(nums[0],nums[heapsize-1]);
heapsize--;
maxheap(nums,0);
}
return nums[heapsize];
}
private:
int heapsize;
};