剑指offer 丑数

1.题目

把只包含质因子2、3、5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。

来源:剑指offer
链接:https://www.nowcoder.com/practice/6aa9e04fc3794f68acf8778237ba065b?tpId=13&tqId=11186&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

2.我的题解

丑数具有以下性质:

  • 仅包含因子2,3,5,即 N = 2 x ∗ 3 y ∗ 5 z ( x , y , z = 0 , 1 , 2 , 3 ⋯   ) N=2^x *3^y *5^z (x,y,z=0,1,2,3\cdots) N=2x3y5z(x,y,z=0,1,2,3)
  • 一个丑数可以由之前的丑数乘以2,3,5得到;
  • 从队首元素1开始,维护三个队列,三个队列下一个元素(先计算,但无需添加)的计算方式分别是乘以2,3,5;但三个队列不是每次都要添加新元素的,仅是下一个元素被选中为下一个丑数的那些队列需要添加进队列。
  • 可以将三个队列合为一个,选用三个指针记录位置,指针指向最小的乘以2(3,5)将超出队尾元素的元素;如果指针处的数乘2(3,5)之后被选为下一个丑数,那么指针右移一位。
队列1队列2队列3丑数1个队列的形式
11111
p2
p3
p5
1,21,(3)1,(5)21, 2
p3
p5
__p2
1,2,(4)1,31,(5)31, 2, 3
p5
__p2
____p3
1,2,41,3,(9)1,(5)41, 2, 3, 4
p5
____p3
______p2
1,2,4,(8)1,3,(9)1,551, 2, 3, 4, 5
________p5
____p3
______p2
class Solution {
public:
    int GetUglyNumber_Solution(int index) {
        if(index<=0)return 0;
        int num2=0,num3=0,num5=0;
        vector<int> res(index);
        res[0]=1;
        for(int i=1;i<index;i++){
            res[i]=min(min(res[num2]*2,res[num3]*3),res[num5]*5);
            if(res[i]==res[num2]*2)num2++;
            if(res[i]==res[num3]*3)num3++;
            if(res[i]==res[num5]*5)num5++;
        }
        return res[index-1];
    }
};

或者

class Solution {
public:
    int GetUglyNumber_Solution(int index) {
        if(index<=0)return 0;
        int num2=0,num3=0,num5=0;
        vector<int> res(index);
        res[0]=1;
        for(int i=1;i<index;i++){
            res[i]=min(min(res[num2]*2,res[num3]*3),res[num5]*5);
            if(res[i]%2==0)num2++;
            if(res[i]%3==0)num3++;
            if(res[i]%5==0)num5++;
        }
        return res[index-1];
    }
};

3.别人的题解

4.总结与反思

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值