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

Posted RUBY-WOO

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了786. 第 K 个最小的素数分数(二分)相关的知识,希望对你有一定的参考价值。

786. 第 K 个最小的素数分数

我们可以二分,L=0,R=1,那么取mid就是0.5,逐个逼近。令结果分数初始化为0/1,m=0,n=1,取完mid再在数组里找小于等于mid的分数个数,同时更新m和n的值,只要Ai/aj的值大于m/n的就更新,直到找到取完mid再在数组里找小于等于mid的分数个数为k,这个时候返回{m,n}即可,否则>k的话,在左边找,否则在右边找。

class Solution {
public:
    vector<int> kthSmallestPrimeFraction(vector<int>& A, int K) {
            double L=0,R=1;
            while(L<R)
            {
                double mid=L+(R-L)/2.0;
                int j=0,t=A.size();
                int cnt=0;
                int m=0,n=1;
                for(int i=0;i<t;++i)
                {
                    while(j<t&&A[i]>mid*A[j])
                        ++j;
                    cnt+=(t-j);
                    if(j<t&&m*A[j]<n*A[i])
                    {
                        m=A[i];
                        n=A[j];
                    }
                }
                if(cnt==K)
                    return {m,n};
                if(cnt<K)
                    L=mid;
                else
                    R=mid;
            }
            return {0,1};
    }
};

以上是关于786. 第 K 个最小的素数分数(二分)的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 786 第K个最小的素数分数[排序] HERODING的LeetCode之路

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

LeetCode_Nov_5th_Week

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

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

AcWing 786. 第k个数