剑指Offer第三十三题:丑数

题目描述

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

 

思路:这里第一个丑数为1,之后便是2,3,5的质因子相关的数字,而且后面的数全是2,3,5的倍数,所以我们可以

  1. 先设一个vector<int>ans,来存储丑数。其中 ans[0] = 1;
  2. 然后给予三个下标,a=0,b=0,c=0;这里我们若寻找第N个丑数。
  3. 首先,若并判断此时并不是第N个,寻找 ans[a]的2倍、ans[b]的3倍、ans[c]的5倍数字,取最小值。这就是第二个丑数,然后取到最小值的下标+1(这里+1就是把最新的丑数作为基础,这里一共三个数字,永远取最小放入,然后比较);

举个例子,如果我们寻找第10个丑数,

首先ans[0]=1,a=0,b=0,c=0;取 ans[a]*2,ans[b]*3,ans[c]*5中最小的,那就是ans[a]*2 = 2,即得到 ans[1] = 2,a++;

然后继续求,a=1,b=0,c=0;取 ans[1]*2,ans[0]*3,ans[0]*5中最小的,那就是ans[0]*3 = 3,即得到 ans[2] = 3,b++;

继续求,a=1,b=1,c=0;取 ans[1]*2,ans[1]*3,ans[0]*5中最小的,那就是ans[1]*2 =4,即得到 ans[3] = 4,a++;

继续求,a=2,b=1,c=0;取 ans[2]*2,ans[1]*3,ans[0]*5中最小的,那就是ans[0]*5 =5,即得到 ans[5] = 5,c++;

继续求,a=2,b=1,c=1;取 ans[2]*2,ans[1]*3,ans[1]*5中最小的,那就是ans[1]*3 =6,即得到 ans[6] = 6,b++;

依次类推,直到求到 ans[10]停止。

方法很巧妙,我一开始直接用暴力求解时间都超了。

 

代码如下:

class Solution {
public:
    int GetUglyNumber_Solution(int index) {
        if(index < 7)
            return index;
        vector<int>ans;
        ans.push_back(1);
        int a = 0, b = 0, c = 0, m;
        for(int i = 1;i<index;i++)
        {
            m =  min(ans[a]*2,min(ans[b]*3,ans[c]*5));
            ans.push_back(m);
            if(ans[a]*2 == m)
                a++;
            if(ans[b]*3 == m)
                b++;
            if(ans[c]*5 == m)
                c++;
        }
        return ans[index-1];       
    }
};

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值