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型再做 [输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入): [画图 ...
随机推荐
- phpcms v9 标签调用,函数,sql
1.截取调用标题长度 {str_cut($r[title],36,'')} 2.格式化时间 调用格式化时间 2011-05-06 11:22:33 {date('Y-m-d H:i:s',$r[inp ...
- 852. spfa判断负环
给定一个n个点m条边的有向图,图中可能存在重边和自环, 边权可能为负数. 请你判断图中是否存在负权回路. 输入格式 第一行包含整数n和m. 接下来m行每行包含三个整数x,y,z,表示存在一条从点x到点 ...
- tcolorbox 宏包简明教程
嗯,我消失好几天了.那么,我都在做什么呢?没错,就是写这篇文章了.这篇文章写起来着实有些费神了.于是,如果你觉得这篇文章对你有帮助,不妨扫描文末的二维码,适量赞助一下哦~! tcolorbox 宏包是 ...
- 《NVM-Express-1_4-2019.06.10-Ratified》学习笔记(4.12-加-6.2-加-7.2.5.2)Fused_Operations
4.12 Fused Operations 融合操作 融合操作通过“fusing”把两个简单的命令融合一起来支持一个更复杂的命令.协议规定这个特性是可选的:如果支持此特性,需要在Figure 247 ...
- 微信小程序之数组操作:push与concat的区别
微信小程序中需要用到数组的操作,push和concat二者功能很相像,但有两点区别. 先看如下例子: var arr = []; arr.push(); arr.push(); arr.push([, ...
- 将自定义工程加入到python根目录下
1. 在D:\Program Files\Python\Lib\site-packages 添加.pth文件,文件名为模块名称(即auto_XXX),文件内容为模块所在目录.(python添加自定义的 ...
- [HNOI2017] 大佬 - DP,BFS,Hash,单调性
这真的是一道综合题.然而感觉A得莫名其妙,交上去的时候其实非常虚,然后就莫名其妙地AC了? 首先我们考虑到,所有和怼有关的操作都是时刻无关的.也就是说,我们把这些操作拆散放到任何时候都对结果不会有影响 ...
- Wannafly Camp 2020 Day 1F 乘法 - 字符串
一开始想根据单调性双指针 后来血了才想起来负负得正 于是暴力二分答案即可 #include <bits/stdc++.h> using namespace std; #define int ...
- C++——字符串处理
11.用字符数组存储和处理字符串 字符数组的声明和引用 字符串: 字符串常量 “china”,没有字符串变量,用字符数组来存放字符串,字符串以‘\0’结束. 字符串数组的初始化: 逐个输出输入字符串 ...
- linux - python2.6.6 升级到python2.7.14
一.升级 Python 2.7.14 版本 1. 准备安装包,系统是最小化安装 # 下载安装依赖的相关包[root@vip ~]# yum install vim gcc make wget -y [ ...