刷題 醜數提取及醜數判斷

2021-10-07 13:11:56 字數 1232 閱讀 6653

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

根據醜數的定義,我們知道醜數一定是由2、3、5乘積得到,可表示成如下公式:

我們預設1是第乙個醜數,初始醜數序列為1,從1開始,得到遍歷所有醜數的方法:

(1)取丑數序列第1個數1×2、3、5得到2、3、5,醜數序列為1、2、3、5;

(2)取丑數序列第2個數2×2、3、5得到4、6、10,醜數序列為1、2、3、5、4、6、10;

(3)取丑數序列第3個數3×2、3、5得到6、9、15,醜數序列為1、2、3、5、4、6、10、6、9、15;

.......

依次類推,我們是可以遍歷得到所有的醜數,但是會發現醜數序列中不斷的會出現重複的數,且醜數序列也沒有排序,邊遍歷邊排序的方法肯定不是解決問題的方法,期望在此尋找醜數方法的基礎上改進。

(1)取丑數序列第1個數1,取3個佇列中隊頭最小的入隊,得到醜數序列為1、2

queue_2:2 

queue_3:3

queue_5:5

(2)取丑數序列第2個數2,取3個佇列中隊頭最小的入隊,得到醜數序列為1、2、3

queue_2:2、4

queue_3:3、6

queue_5:5、10

(3)取丑數序列第2個數3,取3個佇列中隊頭最小的入隊,得到醜數序列為1、2、3、4

queue_2:2、4、6

queue_3:3、6、9

queue_5:5、10、15

......依次類推,可以得到乙個不含重複元素且排列有序的醜數序列。

解題思路中,通過維護3個序列,實現醜數數列的搜尋,設醜數陣列為:ugly[ ],通過解題思路中三個佇列的資料我們發現,第1列的值為ugly[0]×2、3、5,第2列為ugly[1]×2、3、5,所以可以通過三個標誌位flag1、flag2、flag3,分別記錄迴圈處理每步中用於比較的3個值:2×ugly[flag1]、3×ugly[flag2]、5×ugly[flag3],值最小的進入醜數序列,同時標誌位+1。

class solution }\times 3^}\times 5^}" class="mathcode" src=""/>,解題思路:

class solution

bool search(int num)

};

LeetCode刷題 醜數

編寫乙個程式判斷給定的數是否為醜數。醜數就是只包含質因數 2,3,5 的正整數。示例 1 輸入 6 輸出 true 解釋 6 2 3 示例 2 輸入 8 輸出 true 解釋 8 2 2 2 示例 3 輸入 14 輸出 false 解釋 14 不是醜數,因為它包含了另外乙個質因數 7。說明 1 是醜...

LeetCode刷題 醜數

編寫乙個程式判斷給定的數是否為醜數。醜數就是只包含質因數 2,3,5 的正整數。示例 1 輸入 6 輸出 true 解釋 6 2 3 示例 2 輸入 8 輸出 true 解釋 8 2 2 2 示例 3 輸入 14 輸出 false 解釋 14 不是醜數,因為它包含了另外乙個質因數 7。說明 1 是醜...

刷題 醜數 python

題目 把只包含質因子2 3和5的數稱作醜數 ugly number 例如6 8都是醜數,但14不是,因為它包含質因子7。習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。思路 所有醜數可以通過前面的醜數乘2 3 5得到,主要是要知道如何將這些數從小到大排序,以確定排在第n個位置的醜數。...