思路是先将一列读入到优先队列中,然后每次从优先队列中拿出一个最小的元素,同时后面的元素补位置。
class Solution {
public:
vector<int> kthSmallestPrimeFraction(vector<int>& arr, int k) {
int n = arr.size();
auto cmp = [&](const pair<int, int>& x, const pair<int, int>& y) {
return arr[x.first] * arr[y.second] > arr[x.second] * arr[y.first];
};
priority_queue<pair<int, int>, vector<pair<int, int>>, decltype(cmp)> q(cmp);
for (int i = 1; i < n; i++) {
q.emplace(0, i);
}
while (--k) {
auto [i, j] = q.top();
q.pop();
if (i + 1 < j) {
q.emplace(i + 1, j);
}
}
return {arr[q.top().first], arr[q.top().second]};
}
};