思路:
先排序后选择,时间复杂度:O(N*logN),空间复杂度:O(1)。
c++ code:
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
sort(nums.begin(), nums.end());
return nums[nums.size() - k];
}
};
利用快排的思想,用第一个元素作为pivot,以它为界分割其它所有元素,再看左部分的长度已决定下一次如何操作。
平均时间复杂度:O(N),空间复杂度:O(1)。
c++ code:
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
int L = 0, R = nums.size() - 1;
while (L < R) {
int left = L, right = R;
int key = nums[left];
while (left < right) {
while (left < right && nums[right] < key) --right;
nums[left] = nums[right];
while (left < right && nums[left] >= key) ++left;
nums[right] = nums[left];
}
nums[left] = key;
if (left == k - 1) return nums[k - 1];
else if (left > k - 1) R = left - 1;
else L = left + 1;
}
return nums[k - 1];
}
};
DISCUSS中利用堆的方法:
make_heap(RandomAccessIterator first, RandomAccessIterator last)
默认生成的是大顶推,可以使用 make_heap (RandomAccessIterator first, RandomAccessIterator last,Compare comp )
自定义的cmp来生成小顶堆。
pop_heap()
首元素和末元素交换,再重新堆排序。
pop_back()
删除容器中最后一个元素。
c++ code:
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
make_heap(nums.begin(), nums.end());
for(auto i=0; i<k-1;i++) {
pop_heap(nums.begin(), nums.end());
nums.pop_back();
}
return nums.front();
}
};