Leetcode_Heap --264. Ugly Number II [medium]
Write a program to find the n-th ugly number. Ugly numbers are positive numbers whose prime factors only include 2, 3, 5.
編寫一個程式來找到第n個醜數 只包含因子2,3,5的正整數被稱作醜數,比如4,10,12都是醜數,而7,23,111則不是醜數,另外1也是醜數。
判斷方法: 首先除2,直到不能整除為止,然後除5到不能整除為止,然後除3直到不能整除為止。最終判斷剩餘的數字是否為1,如果是1則為醜數,否則不是醜數。
Example:
Input:Input: n = 10 n = 10 Output: 12 Explanation: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 is the sequence of the first 10 ugly numbers.
Note: 1、1 is typically treated as an ugly number. 2、n does not exceed 1690.
Solution:
Python (1) class Solution: def nthUglyNumber(self, n): """ :type n: int :rtype: int """ Ugly = [1] u2 = u3 = u5 = 0 while n > 1: ugly2,ugly3,ugly5 = 2*Ugly[u2],3*Ugly[u3],5*Ugly[u5] min_ugly = min(ugly2,ugly3,ugly5) if min_ugly == ugly2: u2 += 1 if min_ugly == ugly3: u3 += 1 if min_ugly == ugly5: u5 += 1 Ugly.append(min_ugly) n -= 1 return Ugly[-1] (2) from heapq import heappush, heappop class Solution: def nthUglyNumber(self, n): q, Ugly = [1], {1} for i in range(n - 1): m = heappop(q) for mm in [2*m, 3*m, 5*m]: if mm not in Ugly : heappush(q, mm) Ugly .add(mm) return heappop(q)
解題思路: 兩個演算法都是從Discuss上得到的 (1)、醜數是由2、3、5或者它們的乘積組成的數,由上述的例子可以找到相應的規律:醜數序列是由1、2、3、5以及他們的乘積依次形成的序列, ugly2,ugly3,ugly5分別儲存的是1、2、3、5乘以2的倍數,ugly3、ugly5同理,從小到大的排序過程應該是取三個乘積序列中最小的數,依次排列,就是每次的迴圈取出這三個數中的最小數放入醜數序列中,這個最小值對應的是ugly2,ugly3,ugly5中的哪個,哪個的計數就加一位,表示永遠取ugly2,ugly3,ugly5數列最前邊的最大的數,直到n為1為止。 (2)、第二種解法是維護一個堆,q是一個最小堆,其每次向外pop堆中最小的元素,也就是說這個堆一直在向外pop醜數,且pop的醜數大小時依次按照醜數序列增大的,而Ugly中則儲存了所有的醜數,這樣執行了n-1次,那麼再依次pop醜數的時候就是第n個醜數了。