0%

丑数

题目描述

把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。

解答

暴力枚举会超时。根据丑数的定义,丑数一定是比它小的丑数乘2、3、5得到的。

维护一个数组nums[],按照递增序列存储着已得到的丑数。已有丑数乘2、3、5得到的最小的超过已有最大丑数即为要找的下一个丑数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public int GetUglyNumber_Solution(int index) {
if (index <= 0) {
return 0;
}
int[] nums = new int[index];
nums[0] = 1;
int curMax = 1, s2 = 0, s3 = 0, s5 = 0;
for (int i = 1; i < index; i++) {
int t2, t3, t5;
for (; nums[s2] * 2 <= curMax; s2++) {
}
t2 = nums[s2] * 2;
for (; nums[s3] * 3 <= curMax; s3++) {
}
t3 = nums[s3] * 3;
for (; nums[s5] * 5 <= curMax; s5++) {
}
t5 = nums[s5] * 5;

nums[i] = Math.min(Math.min(t2, t3), t5);
curMax = nums[i];

}

return nums[index - 1];
}