You are given a sorted integer array arr
containing 1
and prime numbers, where all the integers of arr
are unique. You are also given an integer k
.
For every i
and j
where 0 <= i < j < arr.length
, we consider the fraction arr[i] / arr[j]
.
Return the kth
smallest fraction considered. Return your answer as an array of integers of size 2
, where answer[0] == arr[i]
and answer[1] == arr[j]
.
Example 1:
Input: arr = [1,2,3,5], k = 3 Output: [2,5] Explanation: The fractions to be considered in sorted order are: 1/5, 1/3, 2/5, 1/2, 3/5, and 2/3. The third fraction is 2/5.
Example 2:
Input: arr = [1,7], k = 1 Output: [1,7]
Constraints:
2 <= arr.length <= 1000
1 <= arr[i] <= 3 * 104
arr[0] == 1
arr[i]
is a prime number for i > 0
.arr
are unique and sorted in strictly increasing order.1 <= k <= arr.length * (arr.length - 1) / 2
O(n2)
complexity?When you get asked this question in a real-life environment, it will often be ambiguous (especially at FAANG). Make sure to ask these questions in that case:
The goal is to find the K-th smallest fraction made from a given list of prime numbers. The brute force approach is simply to generate all possible fractions, sort them, and then pick the K-th one.
Here's how the algorithm would work step-by-step:
def kth_smallest_prime_fraction_brute_force(primes, k):
fractions = []
# Create all possible fractions (p1 / p2) where p1 < p2.
for numerator_index in range(len(primes)):
for denominator_index in range(len(primes)):
if primes[numerator_index] < primes[denominator_index]:
fractions.append((primes[numerator_index] / primes[denominator_index], primes[numerator_index], primes[denominator_index]))
# Sort the fractions based on their values.
fractions.sort(key=lambda x: x[0])
# Return the K-th smallest fraction.
return [fractions[k - 1][1], fractions[k - 1][2]]
We're looking for the K-th smallest fraction made from a given list of prime numbers. Instead of checking all possible fractions, we can use a method to quickly narrow down the possibilities until we find the fraction we need.
Here's how the algorithm would work step-by-step:
def kth_smallest_prime_fraction(primes, k):
low_value = 0.0
high_value = 1.0
while low_value < high_value:
mid_value = (low_value + high_value) / 2.0
count = 0
max_fraction = 0.0
index_i = 0
# Count fractions <= mid_value and track the largest.
for index_j in range(1, len(primes)):
while primes[index_i] / primes[index_j] <= mid_value:
index_i += 1
if index_i == len(primes):
break
count += index_i
if index_i > 0:
max_fraction = max(max_fraction, primes[index_i - 1] / primes[index_j])
# Adjust search range based on the count.
if count == k:
return [primes[int(max_fraction * primes[index_j -1 ])], primes[index_j]]
if count < k:
low_value = mid_value
else:
high_value = mid_value
numerator = 0
denominator = 1
return [numerator, denominator]
Case | How to Handle |
---|---|
Empty array or null array | Return null or throw an IllegalArgumentException as there are no fractions. |
Array with a single prime number | Return null or throw an IllegalArgumentException as a fraction requires two numbers. |
K is less than 1 or greater than the total number of possible fractions (n*(n-1)/2) | Return null or throw an IllegalArgumentException as K is out of bounds. |
Large array size leading to potential memory issues or slow runtime (scalability) | Use a heap-based approach that avoids generating all possible fractions upfront for better memory efficiency. |
Prime numbers leading to potential integer overflow during calculation (numerator/denominator) | Use long data type to avoid overflow issues during the calculation of fractions. |
Duplicate prime numbers in the input array | The algorithm should inherently handle duplicates as fractions are based on index pairs. |
Kth fraction has multiple identical values (e.g., multiple pairs resulting in the same fraction) | Binary search will still find *a* fraction equal to the kth smallest, regardless of duplicates. |
Floating point precision issues when comparing fractions | Compare fractions using a small epsilon value to account for potential precision errors. |