丑数
(为啥我第一次看见这个题,感觉思路很简单,但就是写不出代码呢?总结了一句:就是菜,没有别的原因)
思路:
设置三个指针p2,p3,p5,初始值都为0
设置一个存放丑数的数组vector v 的初始值为1
等于说先开始就是这样的:
存放丑数的数组为1
乘以2的队列:2
乘以3的队列:3
乘以5的队列:5
取队头最小的数为2,分别给每个队列的都增加一个数,就是这个最小数分别乘以2, 3,5 变为:
存放丑数的数组1 2
乘以2的队列:4
乘以3的队列:3 6
乘以5的队列:5 10
取队头最小的数为3,分别给每个队列的都增加一个数,就是这个最小数分别乘以2, 3,5 变为:
存放丑数的数组1 2
乘以2的队列:4 6
乘以3的队列:6 9
乘以5的队列:5 10 15
…
继续算下去,直到存放丑数的数组大小等于index
代码:
class Solution {
public:
int GetUglyNumber_Solution(int index)
{
if(index<7) //小于7的数时,丑数都为本身
return index;
vector<int> v;
int p2=0,p3=0,p5=0;
int num=1;
v.push_back(num);
while(v.size()<index)
{
num=min(v[p2]*2,min(v[p3]*3,v[p5]*5)); //取出队头最小的
if(v[p2]*2==num) p2++; //出队的话只需要指针向后移动就好
if(v[p3]*3==num) p3++;
if(v[p5]*5==num) p5++;
v.push_back(num);
}
return num;
}
};