這裡如果使用暴力演算法,每個數都去判斷是不是醜數就會超過時長,不通過。因此,這裡我們採用空間換時間的方法求解。
根據醜數的定義,醜數應該是另乙個醜數乘以2,3,5的結果。因此我們可以建立乙個陣列,裡面的數字是排序好的醜數,每乙個醜數都是前面的醜數乘以2,3,5得到的。
這裡的關鍵是我們怎麼得到乙個能排好序的醜數陣列。
假設陣列中已經存放若干個排好序的醜數,並且把最大的醜數記為m。如何生成下乙個醜數?
該醜數一定是前面的醜數乘以2,3,5的結果。所以我們先考慮把已有的每乙個醜數乘以2,這樣我們會得到若干個結果,其中有小於等於m的也有大於m的。但是我們可以知道小於等於m的肯定已經在陣列中了。比如12345是乙個醜數陣列,1*2 = 2, 2*2=4, 3*2=6,4*2=8,5*2=10,因為2,4都在陣列中了,所以我們不再考慮。那麼,還有若干個大於m的結果,這裡我們只需要知道第乙個大於m的結果,記作m2。
同理,我們可以得到m3,m5。下乙個醜數就是m2,m3,m5當中最小的結果。
前面的分析,把已有的每乙個醜數乘以2,3,5,是沒有必要的。
因為已有的醜數是按照順序存放在陣列中的,對乘以2而言,假設a*2得到數x是最小的,我們將x加入陣列,那麼下次我們就不需要再對a乘2了,因此,將t2標記向後移一位。
同理更新t3,t5。
class solution
int getuglynumber_solution(int index)
return uglyarray[index - 1];
}};
劍指offer 醜數
把只包含因子2 3和5的數稱作醜數 ugly number 例如6 8都是醜數,但14不是,因為它包含因子7。習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。分析 參考程式設計師面試金典 偽 如下 1 初始化array和佇列 q2 q3 q5 2 將1插入array 3 分別將1 2...
劍指Offer 醜數
我們把只包含因子 2 3 和 5 的數稱作醜數 ugly number 求按從小 到大的順序的第 1500 個醜數。例如 6 8都是醜數,但 14 不是,它包含因子 7。習慣上我們把 1當做第乙個醜數。解法一 逐一判斷是否是醜數,簡單但是不夠高效 數字n是數字m的因子說明m n 0。醜數的因子只有2...
劍指offer 醜數
把只包含因子2 3和5的數稱作醜數 ugly number 例如6 8都是醜數,但14不是,因為它包含因子7。習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。分析 為了保證時間達到要求,可以將所求得的醜數都儲存在陣列中,然後再取出。前面的醜數乘以2 3或5中的最小的乙個是下乙個醜數。...