醜數(Ugly Number):我們把只包含質因子2、3、5的數稱爲醜數。例如4、6、10都是醜數,但是14不是醜數,因爲其包含因子7。
習慣上把1稱爲第一個醜數。
題目:按照從小到大的順序輸出第N個醜數。
題目分析:
- 假設我們已經得到n個醜數,接下來要產生第n+1個醜數;則第n+1個醜數爲前面某個醜數A * 2,B * 3,C * 5中的最小值。
- 第一個醜數爲1,則第二個醜數爲1*2,1*3,1*5中的最小值,即爲2;第三個醜數則爲2*2,1*3,1*5中的最小值,即爲3;以此類推,求出第N個醜數。
- 設置3個變量記錄下標,開始循環,每次將前面醜數的2,3,5的倍數中最小的作爲當前循環的數,更新下標,依次類推,最後輸出數組的N-1索引的值即爲第N個醜數。
JS代碼實現:
function uglyNumber(n){
if(n === 0) return 0;
var uglyNum = [1];
var param2 = 0, param3 = 0, param5 = 0;
for(var i = 1; i < n; i++){
uglyNum[i] = Math.min(uglyNum[param2]*2, uglyNum[param3]*3, uglyNum[param5]*5);
if(uglyNum[i] === uglyNum[param2]*2) param2++;
if(uglyNum[i] === uglyNum[param3]*3) param3++;
if(uglyNum[i] === uglyNum[param5]*5) param5++;
}
return uglyNum[n - 1];
}
Java代碼實現:
public class Solution {
public int GetUglyNumber_Solution(int index) {
if(index <= 0) return 0;
int[] result = new int[index];
result[0] = 1;
int k2=0, k3=0, k5=0;
for(int i = 1; i < index; i++){
result[i] = Math.min(result[k2] *2, Math.min(result[k3] *3, result[k5] *5));
if(result[i] == result[k2] *2)
k2++;
if(result[i] == result[k3] *3)
k3++;
if(result[i] == result[k5] *5)
k5++;
}
return result[index-1];
}
}