这道题虽然难度不大,而且可以用不同方法解决,但是确实学到了不少东西,尤其是第一次看到了优先级队列这种操作。
第一种方法,hash表排序:
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
if (nums.size()<1 || k>nums.size()) {
return 0;
}
multiset<int> mset;
for (int i=0; i<nums.size(); ++i) {
mset.insert(nums[i]);
}
int index = 0;
for (auto& ans : mset) {
if (index == nums.size()-k) {
return ans;
}
++index;
}
return 0;
}
};
第二种方法,优先级队列:
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
if (nums.size()<1 || k>nums.size()) {
return 0;
}
priority_queue<int, vector<int>, greater<int>> numspq;
for (int i=0; i<nums.size(); ++i) {
numspq.push(nums[i]);
if (numspq.size() > k) {
numspq.pop();
}
}
return numspq.top();
}
};
第三中方法,调用C++自带函数:
class Solution {
public:
int findKthLargest(vector<int>& nums, int k) {
if (nums.size()<1 || k>nums.size()) {
return 0;
}
nth_element(nums.begin(), nums.begin()+(nums.size()-k), nums.end());
return nums[nums.size()-k];
}
};
而且自带的方法效率不底,最高的效率是优先级队列。