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};
}
};