题目描述
把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
/*在N为1时,输出为1,N为2时输出为2,设vec为N-1的丑数序列,则第N个丑数肯定
要大于vec里的每个数,也就是前N-1个丑数序列里的某个丑数乘以2,3,5里面的某
一个数得到的,因为他们的公式都是(2^x)*(3^y)*(5^z),
vec[N-1]=(2^k)*(3^m)*(5^p),所以是前N-1个丑数中的某一个丑数乘以
2,3,5中的一个得到,除以一个大于1的数,肯定比它小,而且满足
(2^x)*(3^y)*(5^z)丑数公式,必然是在前N-1个丑数序列中,
如果我用a2,b3,c5记录下,a2代表前a2个数已经乘过2了(不含vec[a2]),也就是已经
存在于N-1的丑数序列中,b3也一样代表前b3个数已经乘过3,c5则表示乘过5,
因为序列中a2之后的乘以2肯定比vec[a2]大,所以不用考虑,
同理,b3,c5之后的数也不用考虑,即比较,vec[a2]*2和vec[b3]*3及vec[c5]*5
的大小即可,挑出其中最小的,给N,同时某个记录号加一*/
class Solution {
public:
int GetUglyNumber_Solution(int index) {
if (index < 7)return index;
vector<int> res(index);
res[0] = 1;
int a2 = 0, b3 = 0, c5 = 0;
for (int i = 1; i < index; ++i)
{
res[i] = min(res[a2] * 2, min(res[b3] * 3, res[c5] * 5));
if (res[i] == res[a2] * 2)a2++;
if (res[i] == res[b3] * 3)b3++;
if (res[i] == res[c5] * 5)c5++;
}
return res[index - 1];
}
};