> 文档中心 > 【从0到1冲刺蓝桥杯国赛】每日一练——丑数Ⅱ

【从0到1冲刺蓝桥杯国赛】每日一练——丑数Ⅱ

丑数Ⅱicon-default.png?t=M276https://leetcode-cn.com/problems/ugly-number-ii/

题目描述: 

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

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

 思路分析:

 

 

 最小堆实现:

class Solution {public:    int nthUglyNumber(int n) { vector factors = {2, 3, 5}; unordered_set seen; priority_queue<long, vector, greater> heap; seen.insert(1L); heap.push(1L); int ugly = 0; for (int i = 0; i < n; i++) {     long curr = heap.top();     heap.pop();     ugly = (int)curr;     for (int factor : factors) {  long next = curr * factor;  if (!seen.count(next)) {      seen.insert(next);      heap.push(next);  }     } } return ugly;    }};

 动态规划:

class Solution {public:    int nthUglyNumber(int n) { vector dp(n + 1); dp[1] = 1; int p2 = 1, p3 = 1, p5 = 1; for (int i = 2; i <= n; i++) {     int num2 = dp[p2] * 2, num3 = dp[p3] * 3, num5 = dp[p5] * 5;     dp[i] = min(min(num2, num3), num5);     if (dp[i] == num2) {  p2++;     }     if (dp[i] == num3) {  p3++;     }     if (dp[i] == num5) {  p5++;     } } return dp[n];    }};