JZX轻语:简
LeetCode 786 - 第K个最小的质数分数
发表于2024年05月06日
一般求解第k小的问题都可考虑使用堆来解决,首先最小的分数为最小的质数/最大的质数
,先将它加入到堆中。每次从堆中处理当前最小的分数时,将其分母左移一位or分子右移一位,再将这两个数放在堆中。直至处理第k
个数即可。由于期间可能会有重复的添加,因此需要引入一个记录上次处理的分子/分母数据,以去重。
import heapq
class Solution:
def kthSmallestPrimeFraction(self, arr: List[int], k: int) -> List[int]:
pq = [(arr[0] / arr[-1], 0, len(arr) - 1)]
i = 0
last_l, last_r = -1, -1
while True:
div, l, r = heapq.heappop(pq)
# 去重
if last_l == l and last_r == r:
continue
last_l, last_r = l, r
i += 1
if i == k:
return [arr[l], arr[r]]
if l + 1 < r:
heapq.heappush(pq, (arr[l + 1] / arr[r], l + 1, r))
heapq.heappush(pq, (arr[l] / arr[r - 1], l, r - 1))