剑指offer-丑数(c++ 指数法)

丑数

把只包含质因子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];
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值