面试题 17.09. 第 k 个数 :「优先队列」&「多路归并」

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试题 17.09. 第 k 个数 :「优先队列」&「多路归并」相关的知识,希望对你有一定的参考价值。

题目描述

这是 LeetCode 上的 面试题 17.09. 第 k 个数 ,难度为 困难

Tag : 「优先队列(堆)」、「多路归并」、「双指针」

有些数的素因子只有 ​​3​​​,​​5​​​,​​7​​​,请设计一个算法找出第 ​​k​​​ 个数。注意,不是必须有这些素因子,而是必须不包含其他的素因子。例如,前几个数按顺序应该是 ​​1​​​,​​3​​​,​​5​​​,​​7​​​,​​9​​​,​​15​​​,​​21​​。

示例 1:

输入: k = 5

基本分析

本题的基本思路与 264. 丑数 II : 从朴素优先队列到多路归并 完全一致。

优先队列(小根堆)

有了基本的分析思路,一个简单的解法是使用优先队列:

  1. 起始先将最小数值
  2. 每次从队列取出最小值,然后将所对应的数值
  3. 对步骤 2 循环多次,第

为了防止同一数值多次进队,我们需要使用数据结构

Java 代码:

class Solution 
public int getKthMagicNumber(int
int[] nums = new int[]3, 5, 7;
PriorityQueue<Long> q = new PriorityQueue<>();
Set<Long> set = new HashSet<>();
q.add(1L); set.add(1L);
while (!q.isEmpty())
long t = q.poll();
if (--k == 0) return (int) t;
for (int x : nums)
if (!set.contains(x * t))
q.add(x * t); set.add(x * t);



return -1;

Python3 代码:

class Solution:
def getKthMagicNumber(self, k: int) -> int:
nums = [3, 5, 7]
q, vis = [], set()
q.append(1)
vis.add(1)
while q:
t = heapq.heappop(q)
k -= 1
if k == 0:
return t
for x in nums:
if t * x not in vis:
heapq.heappush(q, t * x)
vis.add(t * x)
return -1