剑指offer----丑数

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

/*在N为1时,输出为1,N为2时输出为2,设vec为N-1的丑数序列,则第N个丑数肯定
要大于vec里的每个数,也就是前N-1个丑数序列里的某个丑数乘以235里面的某
一个数得到的,因为他们的公式都是(2^x)*(3^y)*(5^z),
vec[N-1]=(2^k)*(3^m)*(5^p),所以是前N-1个丑数中的某一个丑数乘以
2,3,5中的一个得到,除以一个大于1的数,肯定比它小,而且满足
(2^x)*(3^y)*(5^z)丑数公式,必然是在前N-1个丑数序列中,
如果我用a2,b3,c5记录下,a2代表前a2个数已经乘过2了(不含vec[a2]),也就是已经
存在于N-1的丑数序列中,b3也一样代表前b3个数已经乘过3,c5则表示乘过5,
因为序列中a2之后的乘以2肯定比vec[a2]大,所以不用考虑,
同理,b3,c5之后的数也不用考虑,即比较,vec[a2]*2vec[b3]*3vec[c5]*5
的大小即可,挑出其中最小的,给N,同时某个记录号加一*/
class Solution {
public:
    int GetUglyNumber_Solution(int index) {
        if (index < 7)return index;
        vector<int> res(index);
        res[0] = 1;
        int a2 = 0, b3 = 0, c5 = 0;
        for (int i = 1; i < index; ++i)
        {
            res[i] = min(res[a2] * 2, min(res[b3] * 3, res[c5] * 5));
            if (res[i] == res[a2] * 2)a2++;
            if (res[i] == res[b3] * 3)b3++;
            if (res[i] == res[c5] * 5)c5++;
        }
        return res[index - 1];
    }

};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值