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;
        }
    }
};
相關文章
相關標籤/搜索