把只包含質因子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整除,如果乙個數能被...