leetcode 264 丑数2

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

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

失败尝试

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

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

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

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

2 1* 2 2 * 2 3 * 2 4 * 2
3 1* 3 2 * 3 3 * 3 4 * 3
5 1* 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;
    }
};
发布了34 篇原创文章 · 获赞 0 · 访问量 592

猜你喜欢

转载自blog.csdn.net/Luyoom/article/details/103590035