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.
Note:
快排
堆排……我是抗拒的,直接拿priority_queue做。
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.
这题感觉在变着花样考排序……
最简单粗暴的办法
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
sort(nums.begin(), nums.end());
return nums[nums.size()-k];
}
};
快排
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
return patrition(nums, 0, nums.size()-1, k-1);
}
int patrition(vector<int>& nums, int begin, int end, int k){
int l=begin, r=end;
int pivot=nums[begin];
while(l<r){
while(l<r&&nums[r]<=pivot) --r;
nums[l]=nums[r];
while(l<r&&nums[l]>=pivot) ++l;
nums[r]=nums[l];
}
nums[l]=pivot;
if(l==k) return nums[l];
else if(l>k) return patrition(nums, begin, l-1, k);
else return patrition(nums, l+1, end, k);
}
};
看到算法上关于快排的写法回来又看了一下这道题。
改进的写法是这样的,改进的部分是算法不忽略和pivot相等的数,因为当数组含有大量重复值时,快排会出现对数组切分后某一数组为空的情况,因此排序时间会逼近O(N)
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
return patrition(nums, 0, nums.size()-1, k-1);
}
int patrition(vector<int>& nums, int begin, int end, int k){
int l=begin, r=end+1;//为之后r和l在比较之前进行了自增和自减做准备,begin由于是pivot所以本来就不用参与,r则规定为end+1
int pivot=nums[l];
while(l<r){//关于这里为什么没有等于的问题,因为等于的话有可能l和r会越界,例如1,3,2
while(l<r&&nums[--r]<pivot) ;//r和l在比较之前已经进行了自增和自减,注意这里已经没有了等于号,因为去掉了等于号,所以要让l和r的自增减在判断过程中进行
nums[l]=nums[r];
while(l<r&&nums[++l]>pivot) ;//
nums[r]=nums[l];
}
nums[l]=pivot;
if(l==k) return nums[l];
else if(l>k) return patrition(nums, begin, l-1, k);
else return patrition(nums, l+1, end, k);
}
};
堆排……我是抗拒的,直接拿priority_queue做。
class Solution {
public: int findKthLargest(vector<int>& nums, int k)
{
priority_queue<int> pq(nums.begin(), nums.end());
for (int i = 0; i < k - 1; i++)
pq.pop();
return pq.top();
}
};