题解 | #寻找第K大#
寻找第K大
http://www.nowcoder.com/practice/e016ad9b7f0b45048c58a9f27ba618bf
优先队列(小顶堆)方法:
class Solution {
public:
int findKth(vector<int> a, int n, int K) {
// write code here
priority_queue<int, vector<int>, greater<int> > que;
for (int i = 0; i < K; ++i) {
que.push(a[i]); //创建大小为K的优先队列
}
for (int i = K; i < n; ++i) {
if (que.top() < a[i]) {
que.pop();
que.push(a[i]); // 更新优先队列
}
}
return que.top(); // 返回堆顶,即第K大的数
}
};快速排序算法变形
class Solution {
public:
int findKth(vector<int> a, int n, int K) {
return K_quickSelect(a, K);
}
int K_quickSelect(vector<int>& input, int k) {
int l = 0, r = input.size();
while (l < r) {
int p = partition(input, l, r); // 分段
if (p+1 == k) { // 找到第 k 大的数据
return input[p]; // 返回 k 个最小值
}
if (p+1 < k) { // 右半部分
l = p + 1;
}
else { // 左半部分
r = p;
}
}
return input[0];
}
int partition(vector<int>& input, int l, int r) { // 分段实现
int pivot = input[r-1];
int i = l;
for (int j = l; j < r-1; ++j) {
if (input[j] > pivot) {
swap(input[i++], input[j]);
}
}
swap(input[i], input[r-1]);
return i;
}
};
顺丰集团工作强度 335人发布
