Leetocde的两道丑数题目:264. 丑数 II➕313. 超级丑数
Q:
A:
用变量记录已经✖2、✖3、✖5的元素下标i2、i3、i5。表示截止到i2的元素都已经乘过2(结果添加到序列尾部的意思),i3、i5同理。这样每次可以循环可以O(1)时间找到下一个最小的丑数,时间O(N),空间O(N)。
class Solution {
public:
int nthUglyNumber(int n) {
if(n<=0){
return 0;
}
int i2=0,i3=0,i5=0;
vector<int> vec={1};
while(vec.size()<n){
int min_mul=vec[i2]*2;
min_mul=min(min_mul,vec[i3]*3);
min_mul=min(min_mul,vec[i5]*5);
if(min_mul==vec[i2]*2){
i2++;
}
if(min_mul==vec[i3]*3){
i3++;
}
if(min_mul==vec[i5]*5){
i5++;
}
vec.push_back(min_mul);
}
return vec.back();
}
};
还有一种利用堆的方法,堆初始只有一个元素1,第一次循环:堆顶元素1分别✖2、3、5,结果加入堆,堆顶元素1就是第一个丑数,pop掉。这样堆还剩2、3、5。第二次循环:堆顶元素2分别✖2、3、5,结果加入堆,堆顶元素2就是第二个丑数。
这样循环n次,最终会找到第n个丑数。时间O(NlogN),空间O(N)。
Q:
A:
之前是2、3、5,现在是给定了primes.size()个数。那么就建一个数组pos,其中pos[i]指明结果序列中已经乘了primes[i]的最小下标,和上一题类似。
class Solution {
public:
int nthSuperUglyNumber(int n, vector<int>& primes) {
if(n<=0){
return 0;
}
vector<int> vec={1};
vector<int> pos(primes.size(),0);
while(n>1){
--n;
int nex=INT32_MAX;
for(int i=0;i<primes.size();++i){
nex=min(nex,vec[pos[i]]*primes[i]);
}
for(int i=0;i<primes.size();++i){
if(nex==vec[pos[i]]*primes[i]){
pos[i]++;
}
}
vec.push_back(nex);
}
return vec.back();
}
};
Leetocde的两道丑数题目:264. 丑数 II➕313. 超级丑数的更多相关文章
- leetcode 264. 丑数 II 及 313. 超级丑数
264. 丑数 II 题目描述 编写一个程序,找出第 n 个丑数. 丑数就是只包含质因数 2, 3, 5 的正整数. 示例: 输入: n = 10 输出: 12 解释: 1, 2, 3, 4, 5, ...
- Java实现 LeetCode 313 超级丑数
313. 超级丑数 编写一段程序来查找第 n 个超级丑数. 超级丑数是指其所有质因数都是长度为 k 的质数列表 primes 中的正整数. 示例: 输入: n = 12, primes = [2,7, ...
- Leetcode 313.超级丑数
超级丑数 编写一段程序来查找第n个超级丑数. 超级丑数是指其所有质因数都是长度为 k 的质数列表 primes 中的正整数. 示例: 输入: n = 12, primes = [2,7,13,19] ...
- 263. Ugly Number + 264. Ugly Number II + 313. Super Ugly Number
▶ 三个与丑数相关的问题 ▶ 第 263题,判定一个数字是否是丑数,即其素因子是否仅由 2,3,5 构成. ● 常规消除判别,4 ms class Solution { public: bool is ...
- 两道人数多,课程少,query多的题
#每天进步一点点# 来两道很相似的题目~ (智商啊智商.....) hihoCoder #1236:Scores (简单的分桶法+bitset) 2015 Beijing Online的最后一题.题目 ...
- [LeetCode] 313. Super Ugly Number 超级丑陋数
Write a program to find the nth super ugly number. Super ugly numbers are positive numbers whose all ...
- 两道很好的dp题目【4.29考试】
A 问题描述: 对于一个排列,考虑相邻的两个元素,如果后面一个比前面一个大,表示这个位置是上升的,用I表示,反之这个位置是下降的,用D表示.如排列3,1,2,7,4,6,5可以表示为DIIDID. 现 ...
- leetcode简单题目两道(2)
Problem Given an integer, write a function to determine if it is a power of three. Follow up: Could ...
- Ugly number丑数2,超级丑数
[抄题]: [思维问题]: [一句话思路]:Long.valueOf(2)转换为long型再做 [输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入): [画图 ...
随机推荐
- PIE-SDK For C++栅格数据集的读取
1.功能简介 栅格数据包含很多信息,在数据的运用中需要对数据的信息进行读取,目前PIE SDK支持多种数据格式的数据读取,下面对栅格数据格式的数据读取功能进行介绍. 2.功能实现说明 2.1 实现思路 ...
- mysql 基础sql语法总结 (二)DML
二.DML(增.删.改) 1)插入数据 第一种写法:INSERT INTO 表名 (列名1,列名2,,......)VALUES(列值1,列值2,......) 第二种写法:INSERT INTO 表 ...
- win10子系统ubuntu内的nginx启动问题
需用sudo启动,密码是windows密码.
- 使用VSCode创建简单的Razor Webapp--1.入门
1.下载vscode,安装dotnet core sdk 在cmd中使用命令dotnet --version可以查看当前安装的版本 2.打开vscode,设置语言和扩展 在最左边的工具栏,点击最下面的 ...
- Selenium3+python自动化007-等待时间
import time 一.强制等待 sleep(秒) 二.显示等待 使WebDriver等待指定元素条件成立时继续执行,否则在达到最大时长时抛出超时异常(TimeoutException) 1. 导 ...
- 解决git速度太慢的问题,亲测有效
在家用的是电信网,每次git大型项目总是失败,甚是苦恼,解决了好几次都失败了,终忍受不了,下定决心干掉它. git clone特别慢是因为github.global.ssl.fastly.net域名被 ...
- AntDesign(React)学习-8 Menu使用 切换框架页内容页面
本节实现一个点击左侧menu在右侧content切换页面效果,原始代码请从UMI学习-6开始看 1.在pages下添加两个组件,User,UserRole import React from 'rea ...
- AcWing 1019. 庆功会 多重背包求max
//多重背包 max #include <iostream> using namespace std; ; int n, m; int f[N]; int main() { cin > ...
- AcWing 1023. 买书 完全背包
//完全背包 求方案数目 //f[i][j] 只从前i个物品中选,且总体积恰好为j的方案的集合 //f[i][j]=f[i-1][j]+f[i-1][j-v*1]+f[i-1][j-v*2]+...f ...
- 题解【AcWing274】移动服务
题面 非常好的优化 \(\text{DP}\) 状态表示的题目. 首先可以设 \(dp_{i,x,y,z}\) 表示已经做完了前 \(i\) 个请求,现在的 \(3\) 名服务员分别在 \(x\) . ...