编写一个程序,找出第 n
个丑数。
丑数就是质因数只包含 2, 3, 5
的正整数。
两种方法,堆和动态规划
动态规划:
class Solution:
def nthUglyNumber(self, n: int) -> int:
i2, i3, i5 = 0, 0, 0
arr = [1]
for j in range(1, n):
val = min(arr[i2] * 2, arr[i3] * 3, arr[i5] * 5)
arr.append(val)
if val == arr[i2] * 2:
i2 += 1
if val == arr[i3] * 3:
i3 += 1
if val == arr[i5] * 5:
i5 += 1
return arr[n - 1]
堆:
import heapq
class Solution:
def nthUglyNumber(self, n: int) -> int:
"""
因数中只包含2,3,5
:param n:
:return:
"""
list1 = [1]
set1 = set()
cnt = 0
while list1:
val = heapq.heappop(list1)
cnt += 1
if cnt == n:
return val
for prime in {2, 3, 5}:
if val * prime not in set1:
heapq.heappush(list1, val * prime)
set1.add(val * prime)
return list1[0]