標籤: 劍指offerjava
題目描述:
只包含因子2,3,5的數稱爲醜數,1是第一個醜數,求第n個醜數是什麼。算法
思路:
1 . 暴力法。
從1開始遍歷每一個整數,判斷每一個數是否是醜數,是的話計數器加1,當計數器等於n時,返回當前遍歷到的整數。這種算法要計算1到第n個醜數中間的全部數。數組
// 判斷一個數是否爲醜數 public boolean isUgly(int number){ while(number % 2 == 0) number /= 2; while(number % 3 == 0) number /= 3; while(number % 5 == 0) number /= 5; return (number == 1) ? true : false; } // 計算第n個醜數 public int getNthUglyNumber(int n){ if(n <= 0) return 0; int number = 0; int count = 0; while(count < n){ number++; if(isUgly(number)) count++; } return number; }
2 . 空間換時間法
使用數組存儲1開始的全部醜數,每次根據已有醜數計算下一個醜數,並加到數組中,直到n個醜數所有算出來。
這種算法只須要計算每個醜數,忽略掉不是醜數的數,比第一種思路好,可是須要n的空間。
醜數生成規則,由已有醜數x2,x3,x5中選取一個最小值做爲下一個醜數。這裏t2,t3,t5是能生成最新醜數的已有醜數下標,須要不斷更新。code
public int getNthUglyNumber(int n){ if(n <= 0) return 0; int [] uglys = new int[n]; uglys[0] = 1; int pCurr = 0; int t2 = 0; t3 = 0; t5 = 0; while(pCurr < n){ int curr = min(uglys[t2] * 2, uglys[t3] * 3, uglys[t5] * 5); uglys[pCurr] = curr; while(uglys[t2] * 2 <= curr) t2++; while(uglys[t3] * 3 <= curr) t3++; while(uglys[t5] * 5 <= curr) t5++; pCurr++; } int result = uglys[n - 1]; return result; }