前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【LeetCode每日一题】264. 丑数 II

【LeetCode每日一题】264. 丑数 II

作者头像
公众号guangcity
发布2021-04-22 11:36:24
2090
发布2021-04-22 11:36:24
举报
文章被收录于专栏:光城(guangcity)光城(guangcity)

【LeetCode每日一题】264. 丑数 II

题目:给你一个整数 n ,请你找出并返回第 n 个 丑数 。

丑数 就是只包含质因数 2、3 和/或 5 的正整数。

示例 1:

代码语言:javascript
复制
输入:n = 10
输出:12
解释:[1, 2, 3, 4, 5, 6, 8, 9, 10, 12] 是由前 10 个丑数组成的序列。

题解:

解法1:直接生成所有数据,取出对应的元素即可。如果采用递归,肯定会TL,这里采用迭代。

代码语言:javascript
复制
class Solution {
public:
    int nthUglyNumber(int n) {
        vector<int> data;
        int i = 1;

        for (long long i=1; i<INT_MAX; i*=2) {
            for (long long j=i; j<INT_MAX; j*=3) {
                for (long long k=j; k<INT_MAX; k*=5) {
                    data.push_back(k);
                }
            }
        }
        sort(data.begin(), data.end());
        return data[n-1];
    }
   
};

解法2:堆与去重

类似于二叉树的层次遍历,入队操作是以小到大,从堆中出来的每次是最小的,当出来n次时,则结束。

注意:入堆时有重复元素就不要入堆了,因为这样会多算。

代码语言:javascript
复制
class Solution {
public:
    typedef long long LL;
    int nthUglyNumber(int n) {
        set<LL> s;
        priority_queue<LL, vector<LL>, greater<LL>> pq;
        s.insert((LL)1);
        pq.push((LL)1);
        int ans = 1;
        vector<int> factor{2, 3, 5};
        while (n--) {
            LL cur = pq.top(); pq.pop();
            ans = (int)cur;
            // [2,3,5]
            for (auto x : factor) {
                LL mu = cur*x;
                if (s.count(mu)) continue;
                s.insert(mu);
                pq.push(mu);
            }
        }
        return ans;
    }
   
};

解法3:动态规划及三指针。

dp[i]表示第i个丑数,那么dp[i]的转移来自于:

代码语言:javascript
复制
dp[p2]*2、dp[p3]*3、dp[p5]*5

实现:

代码语言:javascript
复制
class Solution {
public:
    typedef long long LL;
    int nthUglyNumber(int n) {
        vector<LL> dp(n+1, 0x3f3f3f3f);
        dp[1] = 1;
        int p2 = 1, p3 = 1, p5 = 1;
        for (int i = 2; i <= n; i++) {
            LL n2 = dp[p2] * 2, n3 = dp[p3] * 3, n5 = dp[p5] * 5;
            dp[i] = min(min(n2, n3), n5);
            if (dp[i] == n2) {                    
                p2++;
            } 
            if (dp[i] == n3) {
                p3++;
            } 
            if (dp[i] == n5) {
                p5++;
            }
        }
        return dp[n];
    }
   
};

本节完~

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-04-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 光城 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 【LeetCode每日一题】264. 丑数 II
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档