786. 第 K 个最小的素数分数
难度 困难
给你一个按递增顺序排序的数组arr
和一个整数 k
。数组 arr 由 1
和若干 素数 组成,且其中所有整数互不相同。
对于每对满足 0 < i < j < arr.length 的 i 和 j ,可以得到分数 arr[i] / arr[j] 。
那么第 k 个最小的分数是多少呢? 以长度为 2 的整数数组返回你的答案, 这里 answer[0] == arr[i] 且 answer[1] == arr[j] 。
示例 1:
输入:arr = [1,2,3,5], k = 3
输出:[2,5]
解释:已构造好的分数,排序后如下所示:
1/5, 1/3, 2/5, 1/2, 3/5, 2/3
很明显第三个最小的分数是 2/5
示例 2:
输入:arr = [1,7], k = 1
输出:[1,7]
提示:
2 <= arr.length <= 1000- 1 <= arr[i] <= 3 * 104
- arr[0] == 1
- arr[i] 是一个 素数 ,i > 0
- arr 中的所有数字 互不相同 ,且按 严格递增 排序
- 1 <= k <= arr.length * (arr.length - 1) / 2
题解
思路一:暴力解法就不说了
class Solution { public int[] kthSmallestPrimeFraction(int[] arr, int k) { int n = arr.length; List<int[]> frac = new ArrayList<int[]>(); for (int i = 0; i < n; ++i) { for (int j = i + 1; j < n; ++j) { frac.add(new int[]{arr[i], arr[j]}); } } Collections.sort(frac, (x, y) -> x[0] * y[1] - y[0] * x[1]); return frac.get(k - 1); } } 作者:LeetCode-Solution 链接:https://leetcode-cn.com/problems/k-th-smallest-prime-fraction/solution/di-k-ge-zui-xiao-de-su-shu-fen-shu-by-le-argw/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
思路二: 对于每一个arr[i] ,求出它的arr[i] / arr[j],它是一个递增的数组 把arr.length个递增的数组求出的k个最小值
官方题解
class Solution { public int[] kthSmallestPrimeFraction(int[] arr, int k) { int n = arr.length; PriorityQueue<int[]> pq = new PriorityQueue<int[]>((x, y) -> arr[x[0]] * arr[y[1]] - arr[y[0]] * arr[x[1]]); for (int j = 1; j < n; ++j) { pq.offer(new int[]{0, j}); } for (int i = 1; i < k; ++i) { int[] frac = pq.poll(); int x = frac[0], y = frac[1]; if (x + 1 < y) { pq.offer(new int[]{x + 1, y}); } } return new int[]{arr[pq.peek()[0]], arr[pq.peek()[1]]}; } }