题目
有些数的素因子只有 3,5,7,请设计一个算法找出第 k 个数。注意,不是必须有这些素因子,而是必须不包含其他的素因子。例如,前几个数按顺序应该是 1,3,5,7,9,15,21。
示例 1:
输入: k = 5
输出: 9
题解1
思路
- 广度优先遍历,每一次遍历到的最小值应符合 n ∈ { ∀ i ∈ { 1 , 3 , 5 } min { v i s i t e d } ∗ i ∧ ∉ v i s i t e d n \in \{\forall i \in \{1,3,5\}\min\{visited\}*i \land \notin visited n∈{∀i∈{1,3,5}min{visited}∗i∧∈/visited
- 遍历 k k k,次便可获得目标值
- min { v i s i t e d } \min\{visited\} min{visited}使用堆获取
代码
class Solution:
def getKthMagicNumber(self, k: int) -> int:
queue = [1]
visited = set([1])
for i in range(k-1):
cur = heapq.heappop(queue)
for division in (3,5,7):
new = cur*division
if new not in visited:
visited.add(new)
heapq.heappush(queue, new)
return heapq.heappop(queue)
复杂度
- 时间复杂度: O ( k log k ) O(k \log k) O(klogk)
- 空间复杂度: O ( k ) O(k) O(k)
题解
思路
- 最小值一定出现则3因子次数、5因子次数、7因子次数的最小值中
代码
class Solution:
def getKthMagicNumber(self, k: int) -> int:
dp,dp3,dp5,dp7 = [1]*k,1,1,1
for i in range(1, k):
n3,n5,n7 = dp[dp3-1]*3, dp[dp5-1]*5, dp[dp7-1]*7
dp[i] = min(n3,n5,n7)
if dp[i] == n3: dp3+=1
if dp[i] == n5: dp5+=1
if dp[i] == n7: dp7+=1
return dp[k-1]
复杂度
- 时间复杂度: O ( k ) O(k) O(k)
- 空间复杂度: O ( k ) O(k) O(k)