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