LeetCode 786 第K个最小的素数分数[排序] HERODING的LeetCode之路
Posted HERODING23
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 786 第K个最小的素数分数[排序] HERODING的LeetCode之路相关的知识,希望对你有一定的参考价值。
解题思路:
剖析题目你就能发现,它的本质是让你对其中的素数对进行排序,排序的标准是素数相比的分数由小往大排序,然后返回第K小的素数对,那么如何排序呢?自定义排序就可以,可以在类外定义,也可以在函数内定义,前者耗时更长,那么排序规则怎么实现呢,毕竟int型不能直接除,这也很好解决,对于[a,b],[c,d]两个素数对,a/b 与 c/d 的比较可以换成a * d 与 b * c的比较,代码如下:
bool compare(const pair<int, int>& x, const pair<int, int>& y)
return x.first * y.second < x.second * y.first;
class Solution
public:
vector<int> kthSmallestPrimeFraction(vector<int>& arr, int k)
int n = arr.size();
vector<pair<int, int>> frac;
for (int i = 0; i < n; ++i)
for (int j = i + 1; j < n; ++j)
frac.emplace_back(arr[i], arr[j]);
sort(frac.begin(), frac.end(), compare);
return frac[k - 1].first, frac[k - 1].second;
;
函数内实现自定义排序代码如下:
class Solution
public:
vector<int> kthSmallestPrimeFraction(vector<int>& arr, int k)
int n = arr.size();
vector<pair<int, int>> frac;
for (int i = 0; i < n; ++i)
for (int j = i + 1; j < n; ++j)
frac.emplace_back(arr[i], arr[j]);
sort(frac.begin(), frac.end(), [&](const auto& x, const auto& y)
return x.first * y.second < x.second * y.first;
);
return frac[k - 1].first, frac[k - 1].second;
;
以上是关于LeetCode 786 第K个最小的素数分数[排序] HERODING的LeetCode之路的主要内容,如果未能解决你的问题,请参考以下文章
《LeetCode之每日一题》:222.第 K 个最小的素数分数