題目
描述
設計一個算法,找出只含素因子2
,3
,5
的第 n 大的數。
符合條件的數如:1, 2, 3, 4, 5, 6, 8, 9, 10, 12...
樣例
如果n = 9
, 返回 10
解答
思路
任何丑數都可以表示為:i^2 * j^3 * k^5;后一個丑數等于前面某個丑數乘以2或3或5:
- 定義一個大小為n的數組u[n]用來存儲有序丑數序列。
- 三個游標
u2,u3,u5
分別表示乘以2或3或5取得過最新丑數。 - 下一個丑數等于
min(u[u2]*2, u[u3]*3, u[u5]*5)
,并根據因子對u2或u3或u5遞增。
代碼
class Solution {
/**
* @param n an integer
* @return the nth prime number as description.
*/
public int nthUglyNumber(int n) {
// Write your code here
int[] u = new int[n];
u[0] = 1;
int u2 = 0,u3 = 0, u5 = 0;
for(int i = 1; i < n; i++){
u[i] = min(min(u[u2]*2,u[u3]*3),u[u5]*5);
if((u[i]/u[u2]) == 2) u2++;
if((u[i]/u[u3]) == 3) u3++;
if((u[i]/u[u5]) == 5) u5++;
}
return u[n-1];
}
public int min(int a, int b){
return a < b ? a : b;
}
};