把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
解析题意:一个数的因子只包含2、3、5,按照题意,因子的含义是,不包含1和它本身,组成它因数的因数。
最初的想法是:暴力破解,即逐个去判断一个数是否符合条件,那么,求一个数的因数,这个过程的时间复杂度就很高了,有没有及简便方法呢,肯定有:
因为因子就是组成这个数的最小单元,并且这些最小单元已经给出了,那就用这些因子去组成数就行了,保证它只含规定的因子,1是第一个丑数,那么2就是第二个,3是第三个,4是第四个,5是第五个,依次6,8,9,10,12.....
程序上怎么实现呢,其实就是这样:
class Solution {
public:
int GetUglyNumber_Solution(int index) {
if (index <= 0)
return 0;
int p2 = 0, p3 = 0, p5 = 0;//初始化三个指向三个潜在成为最小丑数的位置
vector<int> result(index, 0);
result[0] = 1;
for (int i = 1; i < index; ++i)
{
result[i] = min(result[p2] * 2, min(result[p3] * 3, result[p5] * 5));
if (result[i] == result[p2] * 2)
p2++;//为了防止重复需要三个if都能够走到
if (result[i] == result[p3] * 3)
p3++;//为了防止重复需要三个if都能够走到
if (result[i] == result[p5] * 5)
p5++;//为了防止重复需要三个if都能够走到
}
return result[index - 1];
}
};
实现很巧妙。