LeetCode_Nov_5th_Week
Posted KuoGavin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode_Nov_5th_Week相关的知识,希望对你有一定的参考价值。
November 29th : 786. 第 K 个最小的素数分数
November 29th : 786. 第 K 个最小的素数分数
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);
//初始化优先队列中的元素,将n-1个列表中的元素加入到优先队列中去
for (int j = 1; j < n; ++j) q.emplace(0, j);
//从优先队列中依次取出最小值,并加入相应列表中的次小值,循环k次,优先队列的头即为所求
for (int _ = 1; _ < 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];
;
/********************************************************************************************/
//brutal force. 超时
class Solution
public:
vector<int> kthSmallestPrimeFraction(vector<int>& arr, int k)
unordered_map<float, vector<int>> mp;
priority_queue<float, vector<float>, greater<float>> pq;
for(int i = 0; i < arr.size(); ++i)
for(int j = i+1; j < arr.size(); ++j)
float frac = (float)arr[i] / (float)arr[j];
pq.push(frac);
mp[frac] = arr[i], arr[j];
while(k-- != 1) cout << pq.top() << endl; pq.pop();;
return mp[pq.top()];
;
以上是关于LeetCode_Nov_5th_Week的主要内容,如果未能解决你的问题,请参考以下文章