1. 263. 丑数

给你一个整数 n ,请你判断 n 是否为 丑数 。如果是,返回 true ;否则,返回 false 。

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

示例 1:

输入:n = 6
输出:true
解释:6 = 2 × 3

示例 3:

输入:n = 14
输出:false
解释:14 不是丑数,因为它包含了另外一个质因数 7 。

题解

这个题其实很简单。因为丑数的概念就必须是只有2、3、5这三个质因子的数。

那它需要满足什么条件那

  1. 如果这个数是2的倍数则就除2
  2. 如果是3的倍数则就除3
  3. 如果是5的倍数就除5

如果这个是丑数的话,那这样剩下的数一定是1。

证明

如果这个数不是1,那么也不能是2,3,5的倍数。那么他就必须是7, 11 这种的质因子。

这与它是丑数相悖。所以一定满足上面说的条件,那代码就呼之欲出了

代码

class Solution {
public:
bool isUgly(int n) {
if (n < 1)return false;
while(n % 2 == 0) n /= 2;
while(n % 3 == 0) n /= 3;
while(n % 5 == 0) n /= 5;
return n == 1;
}
};

2. 264. 丑数 II

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

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

示例 1:

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

示例 2:

输入:n = 1
输出:1
解释:1 通常被视为丑数。

题解

这个题和上面的区别就是要我们找出第n个丑数。

实际上我们可以先列表找一个感觉1、2、3、4、5、6、8、9、10、12 .....

我们把这个序列称为S那我们要返回的就是S[n]

我们用S2表示只包含质因子2的数。S3表示只包含质因子3的数。S5表示只包含质因子为5的数

S2 : 2, 4, 6 , 8 , ....

S3 : 3, 6, 9 , 12, 15 ...

S5 : 5, 10, 15, ....

可以发现S数组的数就是从S2,S3,S5并操作得到的(在并上一个1)

另外一个特性就是 S2 = 2 * S, S3 = 3 * S , S5 = 5 * S

这样就可以用三个指针指向1这个数。

然后对指针往下移动。依次取三个指针的最小值。最后就可以得到S序列,那代码也就好写了

代码

class Solution {
public:
int nthUglyNumber(int n) {
vector<int>q(1,1); // 表示只有1这个数,是第一个丑数
for (int i = 0, j = 0, k = 0; q.size() < n; ) {
int t = min(q[i] * 2, min(q[j] * 3, q[k] * 5));
if (t == q[i] * 2) i++;
if (t == q[j] * 3) j++;
if (t == q[k] * 5) k++;
q.push_back(t);
}
return q[n - 1];
}
};

3. 313. 超级丑数

超级丑数 是一个正整数,并满足其所有质因数都出现在质数数组 primes 中。

给你一个整数 n 和一个整数数组 primes ,返回第 n超级丑数

题目数据保证第 n超级丑数32-bit 带符号整数范围内。

示例 1:

输入:n = 12, primes = [2,7,13,19]

输出:32

解释:给定长度为 4 的质数数组 primes = [2,7,13,19],前 12 个超级丑数序列为:[1,2,4,7,8,13,14,16,19,26,28,32] 。

示例 2:

输入:n = 1, primes = [2,3,5]
输出:1
解释:1 不含质因数,因此它的所有质因数都在质数数组 primes = [2,3,5] 中。

题解

这个题和上面的题,非常类似哦。

只不过是上面的要求是只能有2,3,5而这个题目给了一个要求是只能包含特定序列的质数

因此这里用了一个小根堆来存储相关的最小值。这样每次logk就可以了

这里的指针移动就是向堆内加入一个新的元素

  1. 这里利用这样的一个堆存储{value, position} position为这个值是由数组中哪个值更新的
  2. 然后算除当前值是由之前的值如何更新的。因为一定是会️一个集合内的素数
  3. 随后将这个集合指针往下移动那就是入堆一个{p * q[idx + 1], idx + 1}

代码

class Solution {
public:
int nthSuperUglyNumber(int n, vector<int>& primes) {
typedef pair<int,int> PII;
priority_queue<PII, vector<PII>, greater<PII>> heap;
for (auto e : primes) {
heap.push({e, 0});
}
vector<int>q(n);
q[0] = 1;
for (int i = 1; i < n; ) {
auto t = heap.top();
heap.pop();
if (t.first != q[i - 1])q[i++] = t.first;
int idx = t.second;
int p = t.first / q[idx];
heap.push({p * q[idx + 1], idx+1});
}
return q[n - 1];
}
};

Leetcode_丑数问题的更多相关文章

  1. AC日记——丑数 codevs 1246

    1246 丑数 USACO  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Description 对于一给定的素 ...

  2. 剑指Offer面试题:29.丑数

    一.题目:丑数 题目:我们把只包含因子2.3和5的数称作丑数(Ugly Number).求按从小到大的顺序的第1500个丑数.例如6.8都是丑数,但14不是,因为它包含因子7.习惯上我们把1当做第一个 ...

  3. 剑指Offer:面试题34——丑数(java实现)

    问题描述: 把只包含因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 思路1: ...

  4. UVA136 求第1500个丑数

    枚举大范围数据..暴力检查题目条件 #include <iostream> #include <cstdio> #include <vector> #include ...

  5. 37.寻找丑数[Ugly numbers]

    [题目] 我们把只包含质因子2.3和5的数称作丑数(Ugly Number),例如:2,3,4,5,6,8,9,10,12,15,等,习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第1500个丑 ...

  6. hdu1058丑数(优先队列、暴力打表)

    hdu1058 题意:当一个数只有2.3.5.7这四种质因数时(也可以一种都没有或只有其中几种),这个数就是丑数,输出第 n 个丑数是多少: 其实并没有发现hdu把这道题放在 dp 专题里的意图,我的 ...

  7. 剑指offer系列59---寻找丑数

    [题目]把只包含因子2.3和5的数称作丑数(Ugly Number). * 例如6.8都是丑数,但14不是,因为它包含因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 解法一 ...

  8. 洛谷P2723 丑数 Humble Numbers

    P2723 丑数 Humble Numbers 52通过 138提交 题目提供者该用户不存在 标签USACO 难度普及/提高- 提交  讨论  题解 最新讨论 暂时没有讨论 题目背景 对于一给定的素数 ...

  9. 【剑指offer 面试题34】丑数

    只包含因子2.3.5的数称作丑数. #include <iostream> #include <vector> using namespace std; int GetUgly ...

随机推荐

  1. IPVS的ICMP报文处理-由内到外

    这里主要明与NAT/Masq转发模式相关的ICMP报文处理,但也会提及由于出错引发的IPVS系统主动发送的ICMP报文. 1.ICMP由外到内处理流程入口 入口函数ip_vs_in实质上挂载在netf ...

  2. 徒手从零实现 uTools 系列(三)- 屏幕取色和截屏

    前言 为了进一步提高开发工作效率,最近我们基于 electron 开发了一款媲美 uTools 的开源工具箱 rubick.该工具箱不仅仅开源,最重要的是可以使用 uTools 生态内所有开源插件!这 ...

  3. AcWing 244. 谜一样的牛

    有n头奶牛,已知它们的身高为 1~n 且各不相同,但不知道每头奶牛的具体身高. 现在这n头奶牛站成一列,已知第i头牛前面有a头牛比它低,求每头奶牛的身高. #include<bits/stdc+ ...

  4. MySQL 插入中文后,显示为空白

    https://blog.csdn.net/sun_hj_95/article/details/79488583 在MySQL中插入中文后,显示如下: 解决方案: 在my.ini (在MySQL的安装 ...

  5. Linux之 du的用法

    du 显示目录和文件的大小,常用命令为 du -sh * du -sm * | sort -n //统计当前目录大小 并按大小 排序 du 无参数 显示当前路径下的目录大小和子目录大小 -b/-k/- ...

  6. php弱类型比较

    前言:今天XCTF题目中出现了弱类型比较,特别过来记录一下, 0x01: == 是弱类型比较,两个不同类型比较时,会自动转换成相同类型后再比较值 ===是强比较,需要比较值和类型 0x02: 看下图案 ...

  7. java面试一日一题:字节java后端工程师面试题

    今天来分享下字节一面面试题,各位小伙伴看看都能答上来吗,弄懂下面的问题你离字节又近了一步哦,加油吧 1.自我介绍: 2.问到项目中为什么选择hbase,如果有多个查询条件如何设置数据存储方案: 3.t ...

  8. ARTS第二周

    第二周. 1.Algorithm:每周至少做一个 leetcode 的算法题2.Review:阅读并点评至少一篇英文技术文章3.Tip:学习至少一个技术技巧4.Share:分享一篇有观点和思考的技术文 ...

  9. 如何处理RabbitMQ 消息堆积和消息丢失问题

    消息堆积 解决方案: 增加消费者或后台相关组件的吞吐能力 增加消费的多线程处理 根据不同的业务实现不同的丢弃任务,选择不同的策略淘汰任务 默认情况下,RabbitMQ消费者为单线程串行消费,设置并行消 ...

  10. 4.Java基础

    为了项目方便管理,创建空项目 一.注释 平时编写代码,在代码量比较少的时候,还可以看懂自己写的,但是当项目结构一复杂起来,我们就需要用到注释了 注释并不会被执行,是给写代码的人看的 书写注释是一个非常 ...