LeetCode 786. 第 K 个最小的素数分数

题目链接:

力扣LeetCode 786. 第 K 个最小的素数分数https://leetcode-cn.com/problems/k-th-smallest-prime-fraction/aaa

LeetCode 786. 第 K 个最小的素数分数

LeetCode 786. 第 K 个最小的素数分数

【方法一 自定义排序】一看数据量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]]

 

上一篇:6.25_打开转盘锁_heapq(python)_HashMap(java)_char**(c的赋值)


下一篇:leetcode347 python