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};
    }
};
posted @ 2020-06-26 23:00  branna  阅读(282)  评论(0编辑  收藏  举报