K-th Smallest Prime Fraction — Binary Search on Value
Advertisement
Problem 343 · K-th Smallest Prime Fraction
Difficulty: Hard · Pattern: BS on Value
Array of sorted primes + 1. Find the kth smallest fraction a[i]/a[j] where i < j.
Solutions
# Python
def kthSmallestPrimeFraction(arr, k):
n = len(arr)
lo, hi = 0.0, 1.0
while hi - lo > 1e-9:
mid = (lo+hi)/2
count = 0; p = q = 0; max_f = 0.0
j = 1
for i in range(n-1):
while j < n and arr[i] > mid*arr[j]: j += 1
count += n-j
if j < n and max_f < arr[i]/arr[j]:
max_f = arr[i]/arr[j]; p, q = arr[i], arr[j]
if count == k: return [p, q]
elif count > k: hi = mid
else: lo = mid
return []
// Java
public int[] kthSmallestPrimeFraction(int[] arr, int k) {
int n=arr.length; double lo=0, hi=1;
while (hi-lo>1e-9) {
double mid=(lo+hi)/2; int cnt=0,p=0,q=1; double maxF=0;
for (int i=0,j=1;i<n-1;i++) {
while (j<n&&arr[i]>mid*arr[j]) j++;
cnt+=n-j;
if (j<n&&(double)arr[i]/arr[j]>maxF) { maxF=(double)arr[i]/arr[j]; p=arr[i]; q=arr[j]; }
}
if (cnt==k) return new int[]{p,q};
else if (cnt>k) hi=mid; else lo=mid;
}
return new int[]{};
}
Complexity
- Time: O(n log(1/epsilon))
- Space: O(1)
Advertisement