面试题 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 : 从朴素优先队列到多路归并 完全一致。
优先队列(小根堆)
有了基本的分析思路,一个简单的解法是使用优先队列:
- 起始先将最小数值
- 每次从队列取出最小值,然后将所对应的数值、和
- 对步骤 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
- 时间复杂度:
- 空间复杂度:LeetCode 面试题 17.09. 第 k 个数
Leetcode刷题100天—面试题 17.14. 最小K个数(优先队列)—day27
Leetcode刷题100天—面试题 17.14. 最小K个数(优先队列)—day27