劍指Offer 醜數

2021-08-20 11:44:38 字數 794 閱讀 9215

題目:

我們把只包含因子2、3和5的數稱作醜數(ugly number)。求按從小到大的順序的第1500個醜數。習慣上把1當做第乙個醜數

解法一:

判斷乙個數是否是醜數:

bool

isuglynumber

(int number)

while (number % 3 == 0)

while (number % 5 == 0)

return number == 1 ? true : false;

}

那麼要求第n個醜數,依次迭代即可。

解法二:

思考醜數是怎麼形成的——都是前面已有醜數乘以2、3或5生成的。假設已有醜數已按增序排列,那麼下乙個醜數一定是已有醜數分別乘以2、3、5得到的數中大於當前最大醜數中的最小的乙個。優化:在乘以2得到的醜數當中有小於當前最大醜數的,也有大於當前最大醜數的,而且一定是某個點前面的小於,後面的大於,我們只需要那個點即可。對於乘以3得到的醜數、乘以5得到的醜數同理。

int

min(const

int a, const

int b, const

int c)

int

getuglynumber

(int index)

return uglynumbers[cnt-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中的最小的乙個是下乙個醜數。...