劍指offer 34 醜數

2021-10-06 23:24:13 字數 1074 閱讀 1481

把只包含質因子2、3和5的數稱作醜數(ugly number)。

例如6、8都是醜數,但14不是,因為它包含質因子7。

習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。

看到這個問題的時候可以這樣想:

解題思路:

因為乙個醜數隻包含質因子2、3和5,也就是說乙個醜數一定由另乙個醜數乘以2或者乘以3或者乘以5得到。這裡採用以「時間換取空間」的辦法,通過構建乙個輔助空間,用來存放每次乘2、乘2、乘5的最小值,在判斷找醜數的同時也給醜數排序了,方便後面的查詢。

**示例:

/**

* 乙個醜數的因子只有2,3,5,也就是說

* 乙個醜數一定由另乙個醜數乘以2或者乘以3或者乘以5得到

* 只用比較3個數:用於乘2的最小的數、用於乘3的最小的數,用於乘5的最小的

* @param index

* @return

*/public

intgetuglynumber_solution

(int index)

if(index ==1)

arraylist

list =

newarraylist

<

>()

; list.

add(1)

;int i2 =

0, i3 =

0, i5 =0;

while

(list.

size()

< index)

if(min == m3)

if(min == m5)

}return list.

get(list.

size()

-1);

}

總結

時間複雜度為o(n)

這裡需要注意的是

這種方法可以避免在非醜數的上的計算時間,提高了一定的效率,但是因為要儲存已經生成的醜數,因此需要建立乙個陣列(陣列通過下標查詢可時間複雜度o(1)),從而增加了空間消耗。

劍指offer 34 醜數

只包含因子2 3 5的數稱為醜數。方法1 逐個判斷每個整數是不是醜數 方法2 建立陣列儲存已經找到的醜數,用空間換時間的方法 每乙個醜數都是前面的醜數乘以2 3 5得到的 已有醜數中最大醜數為m,下乙個醜數應該是已知醜數分別乘以2 3 5的第乙個大於m的數,記錄,每個乘以2 3 5第乙個大於m的位置...

劍指Offer 34 醜數

把只包含因子2 3和5的數稱為醜數,求從小到大的順序的第1500個數。1是第乙個醜數。乙個醜數可以表示成2m3 n5 k2 m3 n5 k 2m3n5k 其中,m n k為自然數zzz。醜數從小到大的順序其實是m n k這三個數中的其中乙個數加一。生成過程 陣列res初始化,儲存了第乙個元素res ...

《劍指offer》 34 醜數的判斷與查詢

題目 我們把只包含因子2,3,5的數稱為醜數 ugly number 求按從小到大的順序的第1500個醜數。例如6,8都是醜數,但14不是,因為它包含因子7.習慣上我們把1當作第乙個醜數。方案一 所謂乙個數m是n的因子的意思是n能被m整除。那麼根據醜數的定義,醜數只能被2,3,5整除,如果乙個數能被...