LeetCode263丑数 LeetCode264丑数二

本文介绍了如何通过编程解决丑数问题,包括判断一个数是否为丑数的方法及如何找到第n个丑数。采用多路归并算法高效地生成丑数序列。

263. 丑数

只要把num中的2, 3, 5除干净即可

class Solution {
public:
    bool isUgly(int n) {
        if (n <= 0) return false;
        while (n % 2 == 0) n /= 2;
        while (n % 3 == 0) n /= 3;
        while (n % 5 == 0) n /= 5;
        return n == 1;
    }
};

264. 丑数 II
要找到第n个丑数,我们就要知道丑数知怎么来的,丑数就是质因子只有2,3,5的数字,所以反过来想一下,一个丑数*2,3,5其中的一个或多个数就可以得到新的丑数,所以就可以将丑数归纳为 [未知丑数][已有丑数] 得来的,所以就可以分为三个丑数序列代表是 *2 *3 *5 得来的丑数序列,再将这三个序列归并成一条序列就是丑数序列,而经过n次这样的操作,序列的最后一个元素就是第n个丑数。那怎么得到这三个丑数序列呢?其实不用实际得到这三个序列,因为可以反过来想每一个序列/2 /3 /5就是原丑数序列,所以根据这两者的相互关系,每次从三个序列中取出最小的值放到答案序列中即可,就可以一边归并成答案序列,一边求要归并的序列,哈哈,这不是很神奇,来看看代码吧!!!

class Solution {
public:
    int nthUglyNumber(int n) {
        vector<int> res(1, 1);
        int i = 0, j = 0, k = 0;
        while (-- n)
        {
            int t = min(res[i] * 2, min(res[j] * 3, res[k] * 5));
            res.push_back(t);
            if (res[i] * 2 == t) i ++;
            if (res[j] * 3 == t) j ++;
            if (res[k] * 5 == t) k ++;
        }
        return res.back();
    }
};

用到了多路归并的算法,S:丑数序列
S2:S * 2
S3:S * 3
S5:S * 5
上面的三个序列都是由丑数序列23*5得到的,所以还是丑数序列,S就是将三个序列归并起来就可以了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hyzhang_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值