K-th Smallest Prime Fraction — Binary Search on Value

Sanjeev SharmaSanjeev Sharma
1 min read

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

Sanjeev Sharma

Written by

Sanjeev Sharma

Full Stack Engineer · E-mopro