寻找丑数

寻找丑数

 丑数一定是前面的某个数乘以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;

    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值