1. 程式人生 > >Leetcode_Heap --264. Ugly Number II [medium]

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個醜數了。