leetcode215. 数组中的第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
解法一,暴力解法:
class Solution {
public:
int findKthLargest(vector& nums, int k) {
long long unsigned int i=1,j=nums.size()-1;
while(j>0){
i = 0;
while(i<=j){
if(nums[i]>nums[i-1]){
swap(nums[i],nums[i-1]);
i++;
}
else{
i++;
}
}
j--;
}
int n;
for(n=1;n
解法二,快速排序法A:
int Partition(vector& nums,int left,int right,int k){
int pivo=nums[left];//选取nums最左端元素作为比较元素
int position=left,j=right;
while(position=pivo && position& nums, int k) {
int left = 0, right = nums.size() - 1;
int target = nums.size() - k;
while(true){
int index=Partition(nums,left,right,k);
if(index==target)
return nums[index];
else if(index
快速排序法改进B:
为了应对如数组全是倒序或几乎所有元素都重复的极端情况(此时复杂度为O(n2)),要对A方法进行改进,即每次选取比较点pivo时要做到随机选取,具体来说就是将nums[left]与nums[random]进行交换,其中random是位于left到right区间的随机正整数
int Partition(vector& nums,int left,int right,int k){
if(left=pivo && position& nums, int k) {
int left = 0, right = nums.size() - 1;
int target = nums.size() - k;
while(true){
int index=Partition(nums,left,right,k);
if(index==target)
return nums[index];
else if(index
解法三,利用优先级队列:
可以利用优先级队列,把 len 个元素都放入一个最大堆中,然后再 pop() 出 k - 1 个元素,选取此时最大堆的堆顶元素,也就是数组中的第 k 个最大元素。
class Solution {
public:
int findKthLargest(vector& nums, int k) {
priority_queue q;//priority_queue是一种C++的container adaptors,默认构成最大堆
for(auto n:nums){
q.push(n);
}
for(int i=nums.size();i>nums.size()-k+1;i--){
q.pop();
}
return q.top();
}
};