题目描述
把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
思路:这里第一个丑数为1,之后便是2,3,5的质因子相关的数字,而且后面的数全是2,3,5的倍数,所以我们可以
- 先设一个vector<int>ans,来存储丑数。其中 ans[0] = 1;
- 然后给予三个下标,a=0,b=0,c=0;这里我们若寻找第N个丑数。
- 首先,若并判断此时并不是第N个,寻找 ans[a]的2倍、ans[b]的3倍、ans[c]的5倍数字,取最小值。这就是第二个丑数,然后取到最小值的下标+1(这里+1就是把最新的丑数作为基础,这里一共三个数字,永远取最小放入,然后比较);
举个例子,如果我们寻找第10个丑数,
首先ans[0]=1,a=0,b=0,c=0;取 ans[a]*2,ans[b]*3,ans[c]*5中最小的,那就是ans[a]*2 = 2,即得到 ans[1] = 2,a++;
然后继续求,a=1,b=0,c=0;取 ans[1]*2,ans[0]*3,ans[0]*5中最小的,那就是ans[0]*3 = 3,即得到 ans[2] = 3,b++;
继续求,a=1,b=1,c=0;取 ans[1]*2,ans[1]*3,ans[0]*5中最小的,那就是ans[1]*2 =4,即得到 ans[3] = 4,a++;
继续求,a=2,b=1,c=0;取 ans[2]*2,ans[1]*3,ans[0]*5中最小的,那就是ans[0]*5 =5,即得到 ans[5] = 5,c++;
继续求,a=2,b=1,c=1;取 ans[2]*2,ans[1]*3,ans[1]*5中最小的,那就是ans[1]*3 =6,即得到 ans[6] = 6,b++;
依次类推,直到求到 ans[10]停止。
方法很巧妙,我一开始直接用暴力求解时间都超了。
代码如下:
class Solution {
public:
int GetUglyNumber_Solution(int index) {
if(index < 7)
return index;
vector<int>ans;
ans.push_back(1);
int a = 0, b = 0, c = 0, m;
for(int i = 1;i<index;i++)
{
m = min(ans[a]*2,min(ans[b]*3,ans[c]*5));
ans.push_back(m);
if(ans[a]*2 == m)
a++;
if(ans[b]*3 == m)
b++;
if(ans[c]*5 == m)
c++;
}
return ans[index-1];
}
};