【刷题-LeetCode】264. Ugly Number II
- 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:
1is typically treated as an ugly number.ndoes not exceed 1690.
解法1
暴力搜索。假设已经知道了前n个丑数\(a_1, a_2, ..., a_n\),求第n+1个丑数,则有:
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的更多相关文章
- [leetcode] 264. Ugly Number II (medium)
263. Ugly Number的子母题 题目要求输出从1开始数,第n个ugly number是什么并且输出. 一开始想着1遍历到n直接判断,超时了. class Solution { public: ...
- [LeetCode] 264. Ugly Number II 丑陋数 II
Write a program to find the n-th ugly number. Ugly numbers are positive numbers whose prime factors ...
- [LeetCode] 264. Ugly Number II 丑陋数之二
Write a program to find the n-th ugly number. Ugly numbers are positive numbers whose prime factors ...
- Leetcode 264. Ugly Number II
Write a program to find the n-th ugly number. Ugly numbers are positive numbers whose prime factors ...
- (medium)LeetCode 264.Ugly Number II
Write a program to find the n-th ugly number. Ugly numbers are positive numbers whose prime factors ...
- LeetCode——264. Ugly Number II
题目: Write a program to find the n-th ugly number. Ugly numbers are positive numbers whose prime fact ...
- 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 ...
- 【LeetCode】264. Ugly Number II
Ugly Number II Write a program to find the n-th ugly number. Ugly numbers are positive numbers whose ...
- 【LeetCode】264. Ugly Number II 解题报告(Java & Python)
标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ https://leetcode.com/prob ...
随机推荐
- LuoguP4263 [Code+#3]投票统计 题解
Content 有 \(t\) 组询问,每组询问给定一个长度为 \(n\) 的数列,请将出现次数最多的数按照从小到大的顺序输出,或者这些数在数列中出现的次数都相等. 数据范围:\(t\) 未知,\(n ...
- AT266 迷子のCDケース 题解
Content 有 \(n+1\) 个碟,编号为 \(0\sim n\),一开始 \(0\) 号碟在播放机上,其他的碟依次放进了 \(n\) 个盒子里面.现在有 \(m\) 次操作,每次操作找到当前在 ...
- CF111A Petya and Inequiations 题解
Content 请找出一个由 \(n\) 个正整数组成的数列 \(\{a_1,a_2,\dots,a_n\}\),满足以下两种条件: \(\sum\limits_{i=1}^na_i^2\geqsla ...
- 什么是协程?与线程和进程对比优劣在哪?gevent协程示例代码
协程 协程,又称微线程,纤程.英文名Coroutine..一句话说明什么是线程:协程是一种用户态的轻量级线程. 协程拥有自己的寄存器上下文和栈.协程调度切换时,将寄存器上下文和栈保存到其他地方,在 ...
- 分布式系统一致性算法(Paxos)
CAP理论 一致性(Consistency) 可用性(Availability) 分区容错性(网络分区)Partition toleranceCAP理论的特点,就是CAP只能满足其中 ...
- .net Core 使用 iTextSharp 生成PDF 简单示例
在 Nuget 中导入需要的插件: 实现的代码: 1 [HttpGet, Route("CreatePdf")] 2 public Response CreatePdf() 3 { ...
- Linux(centos)使用shell脚本停止启动jar包
在jar包目录下创建一个文件,后缀为 .sh #!/bin/bash # stop service pid=`ps -ef | grep "jar包名字" | grep -v &q ...
- 【九度OJ】题目1473:二进制数 解题报告
[九度OJ]题目1473:二进制数 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1473 题目描述: 大家都知道,数据在计算机里中存 ...
- 【LeetCode】190. Reverse Bits 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 解题方法 二进制字符串翻转 位运算 日期 题目地址:https://le ...
- 【剑指Offer】10- II. 青蛙跳台阶问题 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人微信公众号:负雪明烛 目录 题目描述 解题方法 动态规划 日期 题目地址:https: ...