其他分享
首页 > 其他分享> > 786. 第 K 个最小的素数分数(二分)

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,取完,mid,素数,vector
来源: https://www.cnblogs.com/Vampire6/p/13196754.html