丑数
把只包含质因子2,3,5的数称为丑数(ugly number)。例如6,8都是丑数,但14不是,这是因为14包含质因子7。习惯上我们把1当作第一个丑数,求按从小到大的顺序的第N个丑数。
题解:
根据题目,最直接的方式就是暴力穷举法,但是对于暴力穷举法来说,时间复杂度太大,因此抛弃。其代码如下注释部分。
指针法,后来参考题解,了解到三指针法。
对于这种方法,主要是根据已有数据进行数字递增。
对于数组,先存入1。
此时,t2,t3,t5都为0;
此时比较,res[t2]*2,res[t3]*3,res[t5]*5,分别为2,3,5
选择较小数2存入数组
此时,由于res[t2]*2存入数组,数据更新对t2+1。此时t3,t5,仍然是0。重复比较res[t2]*2,res[t3]*3,res[t5]*5,分别为4,3,5
存入3.
不断进行迭代,每次都是保存最小的丑数,从而当数组大小为index时,res[index-1]即为所求丑数
class Solution {
public:
int GetUglyNumber_Solution(int index) {
/*int i=1;//超时代码
int cnt=0;
if(index<1) return 0;
while(true){
int k=i;
while(!(k%2)||!(k%3)||!(k%5)||k==1){
if(!(k%2)) k=k/2;
else if(!(k%3)) k=k/3;
else if(!(k%5)) k=k/5;
if(k==1){
cnt++;
break;
}
}
if(cnt==index)
break;
i++;
}
return i;*/
if (index < 7)return index;
vector<int> res;
res.push_back(1);
int i=0;
int t2=0,t3=0,t5=0;//三指针
while(res.size()<index){
int temp=min(res[t2]*2,min(res[t3]*3,res[t5]*5));//比较三指针所指数的比较
if(res[t2]*2==temp) t2++;//三个指针的更新
if(res[t3]*3==temp) t3++;
if(res[t5]*5==temp) t5++;
res.push_back(temp);//存入数组
}
return res[index-1];
}
};