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之路的主要内容,如果未能解决你的问题,请参考以下文章

786. 第 K 个最小的素数分数(二分)

LeetCode 堆(优先级队列) 相关题目

LeetCode_Nov_5th_Week

《LeetCode之每日一题》:222.第 K 个最小的素数分数

数据结构与算法之深入解析“第K个最小的素数分数”的求解思路与算法示例

LeetCode 5854. 学生分数的最小差值(排序+双指针)