劍指offer32 醜數

2021-09-14 05:35:26 字數 928 閱讀 4538

把只包含質因子2、3和5的數稱作醜數(ugly number)。例如6、8都是醜數,但14不是,因為它包含質因子7。 習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。

題意理解:

1.直接法。逐個判斷每個整數是不是醜數的解法,直觀但不夠高效:所謂乙個數m是另乙個數n的因子,是指n能被m整除,也就是說n%m==0.根據醜數的定義,醜數只能被2,3,5整除。也就是說如果乙個數能被2整除,我們把它連續除以2;如果能被3整除,就連續除以3;如果能被5整除,就除以5.如果最後我們得到的是1,那麼這個數就是醜數,否則不是。

2.巧解法。直接每個數進行判斷顯然是比較費時的。(想到之前做題遇到的一種思路,儲存乙個大小為n的陣列,乙個醜數一定是之前的醜數乘以2、3或者5的結果,在判斷前面某個值為醜數的時候,都對後面的醜數進行覆蓋。但這個僅限於判斷乙個數是否是醜數,而不是返回第n個醜數,所以需要再轉變一下思路)

這種思路的關鍵在於怎樣確定陣列裡面的醜數是排序好的。假設陣列中已經有若干個醜數排好後存放在陣列中,並且把已有的最大的醜數記作m,我們接下來分析如何生成下乙個醜數。該醜數肯定是前面某個醜數乘以2,3,5的結果。所以我們首先考慮把已有的每個醜數乘以2.在乘以2的時候,能得到若干個小於或等於m的結果。由於是按照順序生成的,小於或者等於m肯定已經在陣列中了,我們不需要再次考慮;還會得到若干個大於m的結果,但我們只需要第乙個大於m的結果,因為我們希望醜數是指按從小到大的順序生成的,其他更大的結果以後再說。我們把得到的第乙個乘以2後大於m的結果即為m2.同樣,我們把已有的每乙個醜數乘以3,5,能得到第乙個大於m的結果m3和m5.那麼下乙個醜數應該是m2,m3,m5這3個數的最小者。

public class solution

return ugly[index-1];

}public int min(int a,int b,int c)

}

劍指offer系列之32 醜數

題目描述 把只包含因子2 3和5的數稱作醜數 ugly number 例如6 8都是醜數,但14不是,因為它包含因子7。習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。思路1 乙個數m是另乙個數n的因子,則n能被m整除,即n m 0,根據醜數的定義,醜數只能被2 3 5整除,所以我們...

劍指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...