264. Ugly Number II

問題描述

Write a program to find the nth ugly number.
Ugly numbers are positive numbers whose prime factors only include 2, 3, 5. For example, 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 is the sequence of the first 10 ugly numbers.
Note that 1 is typically treated as an ugly number.

思路分析

  1. 首先,丑數(shù)序列是由且僅由2、3、5相乘得到的數(shù)列。
  2. 一開始我發(fā)現(xiàn),一個新的丑數(shù)是已有丑數(shù)序列中“還沒乘以2的數(shù)乘以2”、“乘過2還沒乘以3的數(shù)乘以3”“乘過2、3還沒乘以5的數(shù)乘以5”中最小的一個。因此想到設立一個pointer數(shù)組,來記錄每個數(shù)是否已經(jīng)乘了2/3/5,然后每次通過搜索pointer數(shù)組來得到“乘過x還沒乘以y的數(shù)”的下標,從而得到新的丑數(shù)。這么做的結果是Time Limit Exceeded,因為每次都要查找pointer數(shù)組。其中還有一個需要注意的問題就是數(shù)的重復(例如2x3 = 3x2)。
  3. 然后我發(fā)現(xiàn),在“乘過x還沒乘以y的數(shù)”都有了之后,當選擇了一個數(shù)后,相應下標加1就是下一個“乘過x還沒乘以y的數(shù)”的下標。因此我將當n<7時的情況作枚舉回答,之后設置初始條件,利用上面的規(guī)律解題,效率得以提高,但只能beats 27.36% of Python submissions.
  4. 再然后,發(fā)現(xiàn)可以將n<7的情況和其他情況納入一個規(guī)則體系,代碼優(yōu)美了很多。
  5. 最后,我發(fā)現(xiàn)我處理相同的數(shù)的方法是,如果這次選出來的數(shù)和已存在的最后一個數(shù)相同,這次循環(huán)結果就作廢,這導致循環(huán)非常冗余。而更好的做法是“得到相同結果的乘數(shù)指針”都+1,這樣完全消除了冗余。Runtime: 236 ms, which beats 52.12% of Python submissions.

AC代碼

#encoding=utf-8
class Solution(object):
    def nthUglyNumber(self, n):
        """
        :type n: int
        :rtype: int
        """
        i2 = 0
        i3 = 0
        i5 = 0
        q = [1]
        j = 1
        while j < n:
            m = min(q[i2] * 2, q[i3] * 3, q[i5] * 5)
            if m == q[i2] * 2:
                i2 += 1
            #如果下面兩個條件判斷用elif,那么后面還需判斷m與已有最后一個丑數(shù)是否相同,相同則跳過,會增加循環(huán)次數(shù)。
            if m == q[i3] * 3:
                i3 += 1
            if m == q[i5] * 5:
                i5 += 1
            q.append(m)
            j += 1
        return q[-1]
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容