中等 第k大元素
19%
通过
在数组中找到第k大的元素
您在真实的面试中是否遇到过这个题?
Yes
样例
给出数组[9,3,2,4,8],第三大的元素是4
给出数组 [1,2,3,4,5],第一大的元素是5,第二大的元素是4,第三大的元素是3,以此类推
注意
第二种,是基于小顶堆,堆里存着是前K个大元素,堆顶是最小元素,基于红黑树实现
你可以交换数组中的元素的位置
两种思路,第一种:基于快速排序,找到一个轴点,左边的比他大,右边的比他小,但是数据多时会超时
class Solution {
public:
/*
* param k : description of k
* param nums : description of array and index 0 ~ n-1
* return: description of return
*/
int kthLargestElement(int k, vector<int> nums) {
// write your code here
int len = nums.size()-1;
if (0 == len) {
return 0;
}
int i = partition(nums, 0, len);
while (i != k-1) {
if (i > k-1) {
i = partition(nums, 0, i-1);
} else {
i = partition(nums, i+1, len);
}
}
return nums[i];
}
int partition(vector<int> &data, int start, int end) {
int i = (rand()%(end-start+1))+start;
swap(data[i], data[end]);
int small = start-1;
for (int i = start; i < end; ++i) {
if (data[i] > data[end]) {
++small;
if (small != i) {
swap(data[i], data[small]);
}
}
}
++small;
swap(data[small], data[end]);
return small;
}
};
第二种,是基于小顶堆,堆里存着是前K个大元素,堆顶是最小元素,基于红黑树实现
class Solution {
public:
/*
* param k : description of k
* param nums : description of array and index 0 ~ n-1
* return: description of return
*/
int kthLargestElement(int k, vector<int> nums) {
// write your code here
int len = nums.size();
if (0 == len || k > len) {
return 0;
}
multiset<int, less<int>> leastnum;
leastnum.clear();
multiset<int, less<int>>::iterator setIter;
for (int x : nums) {
if (leastnum.size() < k) {
leastnum.insert(x);
} else {
setIter = leastnum.begin();
if (x > *(leastnum.begin())) {
leastnum.erase(setIter);
leastnum.insert(x);
}
}
}
return *(leastnum.begin());
}
};