1. Ugly Number II

Write a program to find the n-th ugly number.

Ugly numbers are positive numbers whose prime factors only include 2, 3, 5.

Example:

Input: n = 10
Output: 12
Explanation: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 is the sequence of the first 10 ugly numbers.

Note:

  1. 1 is typically treated as an ugly number.
  2. n does not exceed 1690.

解法1

暴力搜索。假设已经知道了前n个丑数\(a_1, a_2, ..., a_n\),求第n+1个丑数,则有:

\[a_{n+1} = \min\{2*a_i, 3*a_j, 5*a_k\}, \quad \forall i, j, k\in[1, n]\\
s.t\quad a_{n+1} > a_n
\]
class Solution {
public:
int nthUglyNumber(int n) {
vector<int>u_n{1};
int prime[3] = {2, 3, 5};
while(u_n.size() < n){
int flag = 0;
int cur_n = INT_MAX;
for(int i = u_n.size() - 1; i >= 0; --i){
for(int j = 0; j < 3; ++j){
if(u_n[i]*prime[j] > u_n.back()){
cur_n = min(cur_n, u_n[i]*prime[j]);
}else{
flag++;
}
}
if(flag == 3)break;
}
u_n.push_back(cur_n);
}
return u_n.back();
}
};

但是提交会超时。。。

解法2 对解法1进行改进。显然丑数数组是有序的,可以用二分查找完成,查找的问题描述为:

寻找第一次出现的满足 \(k\times a_i > a_n\)的\(a_i\)

搜索过程为:对于区间\([l, r]\)

  • \(k\times a_{mid} > a_n\),则满足条件的肯定在\([l, mid]\)中
  • \(k\times a_{mid} \leq a_n\),则满足条件的肯定在\([mid+1, r]\)中
typedef long long int LL;
class Solution {
public:
int nthUglyNumber(int n) {
vector<LL>u_n{1};
int prime[3] = {2, 3, 5};
while(u_n.size() < n){
LL cur_n = LLONG_MAX;
for(int j = 0; j < 3; ++j){
int idx = bin_search(u_n, prime[j]);
cur_n = min(cur_n, prime[j]*u_n[idx]);
}
u_n.push_back(cur_n);
}
return u_n.back();
}
int bin_search(vector<LL>&nums, int k){
int last_num = nums.back();
int l = 0, r = nums.size()-1;
while(l < r){
int mid = (l + r) / 2;
if(nums[mid]*k > last_num)r=mid;
else l = mid + 1;
}
return l;
}
};

解法3 注意到事实:如果\(a_n\)是丑数,则\(2a_n, 3a_n, 5a_n\)也是丑数

typedef long long int LL;
class Solution {
public:
int nthUglyNumber(int n) {
priority_queue<LL, vector<LL>, greater<LL>>q;
set<LL>s;
int prime[3] = {2, 3, 5}; q.push(1);
s.insert(1);
LL ans = q.top();
for(int i = 0; i < n; ++i){
ans = q.top();
q.pop();
s.erase(ans);
for(int j = 0; j < 3; ++j){
if(s.find(ans*prime[j]) == s.end()){
q.push(ans*prime[j]);
s.insert(ans*prime[j]);
}
}
}
return ans;
}
};

解法4 根据解法三种事实,利用动态规划

class Solution {
public:
int nthUglyNumber(int n) {
int pre2 = 0, pre3 = 0, pre5 = 0;
int nums[1690];
nums[0] = 1;
for(int i = 1; i < n; ++i){
int ugly = min(nums[pre2]*2, min(nums[pre3]*3, nums[pre5]*5));
nums[i] = ugly;
if(ugly % 2 == 0)pre2++;
if(ugly % 3 == 0)pre3++;
if(ugly % 5 == 0)pre5++;
}
return nums[n-1];
}
};

【刷题-LeetCode】264. Ugly Number II的更多相关文章

  1. [leetcode] 264. Ugly Number II (medium)

    263. Ugly Number的子母题 题目要求输出从1开始数,第n个ugly number是什么并且输出. 一开始想着1遍历到n直接判断,超时了. class Solution { public: ...

  2. [LeetCode] 264. Ugly Number II 丑陋数 II

    Write a program to find the n-th ugly number. Ugly numbers are positive numbers whose prime factors ...

  3. [LeetCode] 264. Ugly Number II 丑陋数之二

    Write a program to find the n-th ugly number. Ugly numbers are positive numbers whose prime factors ...

  4. Leetcode 264. Ugly Number II

    Write a program to find the n-th ugly number. Ugly numbers are positive numbers whose prime factors ...

  5. (medium)LeetCode 264.Ugly Number II

    Write a program to find the n-th ugly number. Ugly numbers are positive numbers whose prime factors ...

  6. LeetCode——264. Ugly Number II

    题目: Write a program to find the n-th ugly number. Ugly numbers are positive numbers whose prime fact ...

  7. leetcode 263. Ugly Number 、264. Ugly Number II 、313. Super Ugly Number 、204. Count Primes

    263. Ugly Number 注意:1.小于等于0都不属于丑数 2.while循环的判断不是num >= 0, 而是能被2 .3.5整除,即能被整除才去除这些数 class Solution ...

  8. 【LeetCode】264. Ugly Number II

    Ugly Number II Write a program to find the n-th ugly number. Ugly numbers are positive numbers whose ...

  9. 【LeetCode】264. Ugly Number II 解题报告(Java & Python)

    标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ https://leetcode.com/prob ...

随机推荐

  1. CF652B z-sort 题解

    Content 定义一个数组是 \(\text{Z}\) 排序过的,当且仅当: 对于所有的 \(i=2k+1(k\in\mathbb Z)\),\(a_i\leqslant a_{i-1}\). 对于 ...

  2. java 编程基础 Class对象 反射 :数组操作java.lang.reflect.Array类

    java.lang.reflect包下还提供了Array类 java.lang.reflect包下还提供了Array类,Array对象可以代表所有的数组.程序可以通过使 Array 来动态地创建数组, ...

  3. 用setTimeout实现setInterval

    timerFun(); function timerFun() { console.log("实现操作部分") let timer = setTimeout(function () ...

  4. SpringBoot项目bootstrap.yml配置文件不加载

    bootstrap.yml需要引入springcloud的包才会加载 <dependency> <groupId>org.springframework.cloud</g ...

  5. SpringBoot整合knife4j框架(可生成离线接口文档),并设置接口请求头token默认值

    功能和swagger类似 官网地址:https://doc.xiaominfo.com/knife4j/ 这个框架可以设置返回字段的描述 引入依赖 <dependency> <gro ...

  6. 【LeetCode】405. Convert a Number to Hexadecimal 解题报告(Java & Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 Java解法 Python解法 日期 题目地址:ht ...

  7. hdu 1431 素数回文(暴力打表,埃托色尼筛法)

    这题开始想时,感觉给的范围5 <= a < b <= 100,000,000太大,开数组肯定爆内存,而且100000000也不敢循环,不超时你打我,反正我是不敢循环. 这题肯定得打表 ...

  8. Accelerating Deep Learning by Focusing on the Biggest Losers

    目录 概 相关工作 主要内容 代码 Accelerating Deep Learning by Focusing on the Biggest Losers 概 思想很简单, 在训练网络的时候, 每个 ...

  9. JSP中的九大内置对象

    JSP九大内置对象 pageContext 存东西 Request 存东西 Response Session 存东西 Application(servletContext) 存东西 config(se ...

  10. javaScript系列 [43]-TS、Class and ES5

    本文讨论Typescript中的Class同ES5构造函数的对应关系,涉及TypeScript的诸多语法.构造函数.面向对象以及原型对象等相关知识点细节,本文只简单对比并不进行深入展开. TypeSc ...