题目链接:
力扣https://leetcode-cn.com/problems/k-th-smallest-prime-fraction/aaa
【方法一 自定义排序】一看数据量n<=1000,组合起来也只有n^2,再排序的话O(n^2log(n^2))也不会超时。
class Solution:
def kthSmallestPrimeFraction(self, arr, k: int):
n = len(arr)
tmp = []
for i in range(n):
for j in range(i + 1, n):
tmp.append([arr[i] / arr[j], [i, j]])
tmp.sort(key=lambda x: x[0])
return tmp[k][1]
【方法二 优先队列】arr=[1,2,3,5],我们可以以分母划分所有的素分数为多个有序链表,以示例1为例子的话[1, 2, 3, 5]
list1: 1/5 2/5 3/5. 以5为分母的一个链表,随着分子的增大而增大。
list2: 1/3 2/3
list3: 1/2
这样就成了合并K个有序链表这样的问题啦。利用优先队列,我们先把表头也就是以每个数为分母的最小的数压入优先队列。然后取出最小的来,提取出分母和分子,再压入以这个分母划分的一列中第二小的分数,直到取出第k个来。
class Solution:
def kthSmallestPrimeFraction(self, arr: List[int], k: int) -> List[int]:
import heapq
t, n = 0, len(arr)
priority_queue = []
for i in range(1, n):
heapq.heappush(priority_queue, (arr[0]/arr[i], [0, i]))
while t != k:
top = heapq.heappop(priority_queue)
x, y = top[1]
if x + 1 < y:
heapq.heappush(priority_queue, (arr[x + 1]/arr[y], [x + 1, y]))
t += 1
return [arr[x], arr[y]]