[LeetCode] Super Ugly Number (Medium)
最后WA没做出来.
typedef long long int64;
#define MAXBOUND 10000000
class Solution {
public:
int nthSuperUglyNumber(int n, vector<int>& primes) {
bitset<MAXBOUND> bs;
int64 bound = MAXBOUND;
vector<int> v;
bs.set(1);
for (int i = 0; i < primes.size(); ++i) {
bs.set(primes[i]);
}
for (int64 i = 1; i < bound; ++i) {
if (!bs[i]) continue;
--n;
bs.set(i);
v.push_back(i);
if (n <= 0) return i;
for (int j = 0; j < v.size(); ++j) {
int64 val = v[j];
if (val >= bound / i) break;
bs.set(i * val);
}
}
return -1;
}
};
最后一个case过不了:
Input: 100000
[7,19,29,37,41,47,53,59,61,79,83,89,101,103,109,127,131,137,139,157,167,179,181,199,211,229,233,239,241,251]
Output: -1
Expected: 1092889481
bitset没法开到10^9
这么大.
// @zjh08177
int nthSuperUglyNumber(int n, vector<int>& primes) {
vector<int> index(primes.size(), 0), ugly(n, INT_MAX);
ugly[0]=1;
for(int i=1; i<n; i++){
for(int j=0; j<primes.size(); j++) ugly[i]=min(ugly[i],ugly[index[j]]*primes[j]);
for(int j=0; j<primes.size(); j++) index[j]+=(ugly[i]==ugly[index[j]]*primes[j]);
}
return ugly[n-1];
}
思路:
假设primes=[2,3]
且已经计算出了前n
个SUN, 即SUN[0]
到SUN[n-1]
, 那么SUN[n]
是多少?
在0
到n-1
中找到一个最小的a
使得SUN[a]*2>SUN[n-1]
. 同样地在0
到n-1
中找到一个最小的b
使得SUN[b]*3>SUN[n-1]
. 下一个SUN一定是SUN[a]*2
和SUN[b]*3
中较小的那个. 假设SUN[a]*2
较小, 那么SUN[n]
就是SUN[a]*2
.
再想一步, SUN[n+1]
是多少?
一定是SUN[a+1]*2
和SUN[b]*3
中较小的那一个.
至此可以看出规律, 创建长度为n
的数组ugly
记录前n
个SUN. 创建长度为k
的index数组, 其中记录着意义如上面a
和b
的index值.
初始时, ugly[0]=1, ugly[其他]=INT_MAX
. index中元素都为0
. 接下来从ugly[1]
更新到ugly[n-1]
, 更新ugly[i] (i=1~n-1)
时:
找到ugly[index[j]] * primes[j] (j=0~k-1)
中最小的那个(对应的下标j
记做jmin
), 写入到ugly[i]
, 然后index[jmin]++
.
最后, ugly[n-1]
就是所求.
时间复杂度O(nk)
.
空间复杂度O(n+k)
.
[LeetCode] Super Ugly Number (Medium)的更多相关文章
- [LeetCode] Super Ugly Number 超级丑陋数
Write a program to find the nth super ugly number. Super ugly numbers are positive numbers whose all ...
- LeetCode() Super Ugly Number
用了优先队列,还是超时 class Solution { public: int nthSuperUglyNumber(int n, vector<int>& primes) { ...
- [LeetCode] 313. Super Ugly Number 超级丑陋数
Write a program to find the nth super ugly number. Super ugly numbers are positive numbers whose all ...
- Leetcode 313. super ugly number
Write a program to find the nth super ugly number. Super ugly numbers are positive numbers whose all ...
- 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 ...
- Super Ugly Number -- LeetCode
Write a program to find the nth super ugly number. Super ugly numbers are positive numbers whose all ...
- [LintCode] Super Ugly Number 超级丑陋数
Write a program to find the nth super ugly number. Super ugly numbers are positive numbers whose all ...
- 313. Super Ugly Number
题目: Write a program to find the nth super ugly number. Super ugly numbers are positive numbers whose ...
- Ugly Number,Ugly Number II,Super Ugly Number
一.Ugly Number Write a program to check whether a given number is an ugly number. Ugly numbers are po ...
随机推荐
- loadrunner简单的例子(demo)
刚刚做了一个loadrunner进行负载测试,把步骤截图给大伙看看.一共三个步骤 一创建/编辑脚本 二运行负载测试 三分析测试结果 首先是第一步的流程:第一步创建/编辑脚本 图一 图二 图三 图四 图 ...
- Java联网技术之一HTTP
学到Java的联网技术,这里首先来看看关于URl, 要从网上获得内容, 需要实现下面的4步, 1.创建一个表示资源的网络地址的URL对象, 2.创建一个HttpURLConnection 连接对象 3 ...
- Sql触发器脚本
ALTER Trigger [dbo].[test] --新建触发器 On [dbo].[test1] --在test1表中创建触发器 for insert --触发条件 As --事件触发后所要做的 ...
- jQuery Validate验证框架使用
jQuery Validate使用前的准备,需要下载相应js包括:1.jquery.validate.min.js.2.additional-methods.min.js. 当然必不可少的js jQu ...
- PhotoView开源项目剖析
http://blog.csdn.net/wu928320442/article/details/43056731 介绍 上一节呢,我们介绍了怎么下载和编译Android源码,这节呢,我们来讨论Pho ...
- javaee学习-servlet初始化参数
1.需要定义ServletConfig对象来接收servlet配置的初始化参数. 2.当servlet配置了初始化参数后,web容器在创建servlet实例对象时, 会自动将这些初始化参数封装到Ser ...
- java.util.Map源码分析
/** * An object that maps keys to values. A map cannot contain duplicate keys; * each key can map to ...
- ScrollView 尽量避免嵌套RelativeLayout,非常惨痛的教训
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android=&q ...
- Traveller数据访问路径
2015年10月数据访问路径
- WORDPRESS插件开发(二)HELLO WORLD改进版
在上一篇文章中WORDPRESS插件开发(一)HELLO WORLD,演示了Hello World的最简单实现,只是在每篇文章的后面加入Hello World字符,而且字符也是写死的. 如果用户需要自 ...