786. K-th Smallest Prime Fraction

786. K-th Smallest Prime Fractionhtml

 

http://www.javashuo.com/article/p-xgkedggq-en.html数组

数组自己是排序的,因此固定一个数,从左向右获得的分数是逐渐减少的。spa

使用二分查找,设定一个值,而后统计全部小于这个数的个数,若是个数小于指望的k,那么把这个数调大再统计,若是大于指望k,把这个数调小再统计,直到个数等于k。code

注意:1.left、right定义时必须是double的,由于分数不是整数htm

   2.每次统计,统计的j的位置是第一个小于mid的位置,也就是说以前的数都是大于mid的,由于求的是第k小,因此必须是n-j来得到到底有多少个小的数blog

   3.由于须要返回第k小的分数的分子、分母,因此必须进行保存。i固定j滑动每次中止的位置,确定有一个是这个第k小的,可是你并不能保证i=0 j中止的数必定大于i = 1 j中止的数,因此取其中最大的就是真正的那个须要的数排序

   4.mid*A[j] < A[i] A[i]*q > p*A[j]都是为了保证除数进行无限循环get

   5.count < K的时候是left = mid,而不是right = mid,由于这个时候count不够,你须要调大mid值,调大也就是增大leftio

   6.count的统计是i固定每一个位置,而后j向后滑动获得的总的count值class

class Solution {
public:
    vector<int> kthSmallestPrimeFraction(vector<int>& A, int K) {
        double left = 0,right = 1;
        vector<int> res;
        int n = A.size();
        while(true){
            double mid = left + (right - left)/2.0;
            int count = 0,p = 0,q = 1;
            for(int i = 0;i < n;i++){
                int j = i + 1;
                while(j < n && mid*A[j] < A[i])
                    j++;
                count += n - j;
                if(j < n && A[i]*q > p*A[j]){
                    p = A[i];
                    q = A[j];
                }
            }
            if(count == K){
                res.push_back(p);
                res.push_back(q);
                return res;
            }
            else if(count < K)
                left = mid;
            else
                right = mid;
        }
    }
};
相关文章
相关标签/搜索