leetcode 264 丑数2

丑数进阶版 !到底是第几个丑?

此题是在原来丑数的基础上
寻找第几个丑数

失败尝试

想直接判断打表
1690内的所有丑数
果不其然 超时福利放送

一个个判断不行
那就需要寻找 数据规律

观察可得
丑数的基础上乘 2, 3, 5 仍然是丑数 – 简化判断

所以丑数可以由以下列表组成

21* 2 2 * 2 3 * 2 4 * 2
31* 3 2 * 3 3 * 3 4 * 3
51* 2 2 * 2 3 * 2 4 * 2

做法:

  • 维护三个list – ugly2, ugly3, ugly5
    分别储存** now* 2, now* 3, now*5**
  • 取三个list 开头的 最小值 – 第 cnt 个丑数 (相当于是对丑数的排序过程)
  • 直到 cnt 到达 n 为止 – 即取第n个丑数

代码如下:

class Solution {
public:
    int nthUglyNumber(int n) {
        list<long long> ugly2;
        list<long long> ugly3;
        list<long long> ugly5;
        long long now = 1;
        int cnt = 1;
        while (cnt != n) {
            ugly2.push_back(now * 2);
            ugly3.push_back(now * 3);
            ugly5.push_back(now * 5);

            long long min2 = ugly2.front();
            long long min3 = ugly3.front();
            long long min5 = ugly5.front();

            long long MIN = min(min2, min(min3, min5));
            if (min2 == MIN) ugly2.pop_front();
            if (min3 == MIN) ugly3.pop_front();
            if (min5 == MIN) ugly5.pop_front();
            now = MIN;
            cnt++;
        }
        return now;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值