寻找丑数
丑数一定是前面的某个数乘以2或者3或者5得到的,在这个基础上可以进行数学归纳法证明其正确性。为了能够迭代的构造这个数列,需要记录当前2,3,5作为乘数因子大于数组最末端的数组的位置
1. 设置p2,p3,p5均是0,
2. 设置当前数组第一个元素为1
3. 迭代开始,每次都保证array[p2]*2,array[p3]*3,array[p5]*5都大于array的末端元素,取最小的那个。
4. 重复步骤3,知道求出需要知道的第几个丑数
class Solution {
public:
int GetUglyNumber_Solution(int index) {
vector<int> array;
if(index<=0)
return 0;
array.push_back(1);
int p2=0;
int p3=0;
int p5=0;
for(int i=0;i<index;i++){
array.push_back(_min(array,p2,p3,p5,i));
}
return array[index-1];
}
static int _min(vector<int> array,int &x,int &y,int &z,int i){
while(array[x]*2<=array[i])
x++;
while(array[y]*3<=array[i])
y++;
while(array[z]*5<=array[i])
z++;
return getmin(array[x]*2,array[y]*3,array[z]*5);
}
static int getmin(int x,int y,int z){
int ret=y;
if(x<=y)
ret=x;
if(z<=ret)
ret=z;
return ret;
}
};