[LintCode] Super Ugly Number 超级丑陋数
2016-04-27 13:54
459 查看
Write a program to find the nth super ugly number.
Super ugly numbers are positive numbers whose all prime factors are in the given prime list primes of size k. For example, [1, 2, 4, 7, 8, 13, 14, 16, 19, 26, 28, 32] is the sequence of the first 12 super ugly numbers given primes = [2, 7, 13, 19] of size 4.
Notice:
1 is a super ugly number for any given primes.
The given numbers in primes are in ascending order.
0 < k ≤ 100, 0 < n ≤ 10^6, 0 < primes[i] < 1000
Example
Given n = 6, primes = [2, 7, 13, 19] return 13
LeetCode上的原题,请参见我之前的博客Super Ugly Number。
解法一:
解法二:
Super ugly numbers are positive numbers whose all prime factors are in the given prime list primes of size k. For example, [1, 2, 4, 7, 8, 13, 14, 16, 19, 26, 28, 32] is the sequence of the first 12 super ugly numbers given primes = [2, 7, 13, 19] of size 4.
Notice:
1 is a super ugly number for any given primes.
The given numbers in primes are in ascending order.
0 < k ≤ 100, 0 < n ≤ 10^6, 0 < primes[i] < 1000
Example
Given n = 6, primes = [2, 7, 13, 19] return 13
LeetCode上的原题,请参见我之前的博客Super Ugly Number。
解法一:
class Solution { public: /** * @param n a positive integer * @param primes the given prime list * @return the nth super ugly number */ int nthSuperUglyNumber(int n, vector<int>& primes) { vector<int> res(1, 1), pos(primes.size(), 0); while (res.size() < n) { vector<int> t; for (int i = 0; i < primes.size(); ++i) { t.push_back(res[pos[i]] * primes[i]); } int mn = INT_MAX; for (int i = 0; i < primes.size(); ++i) { mn = min(mn, t[i]); } for (int i = 0; i < primes.size(); ++i) { if (t[i] == mn) ++pos[i]; } res.push_back(mn); } return res.back(); } };
解法二:
class Solution { public: /** * @param n a positive integer * @param primes the given prime list * @return the nth super ugly number */ int nthSuperUglyNumber(int n, vector<int>& primes) { vector<int> dp(n, 1), pos(primes.size(), 0); for (int i = 1; i < n; ++i) { dp[i] = INT_MAX; for (int j = 0; j < primes.size(); ++j) { dp[i] = min(dp[i], dp[pos[j]] * primes[j]); } for (int j = 0; j < primes.size(); ++j) { if (dp[i] == dp[pos[j]] * primes[j]) { ++pos[j]; } } } return dp.back(); } };
相关文章推荐
- iOS -- 无开发者账号真机调试
- Python使用pip install psycopg2安装psycopg2包出现python setup.py egg_info failed with error code 1 in /tmp/pip-build-YtLeN3/psycopg2错误处理
- Cannot run program "/home/user/Android/Sdk/build-tools/23.0.2/aapt": error=2 No such file or directo
- SQL优化:重新编译存储过程和表
- 钢管焊缝缺陷检测
- ListView使用技巧(一):ViewHolder
- 直接选择排序
- 《构建之法》第六、七章读后感
- actionbarsherlock示例
- 自制简易导航页
- 活用shape、selector和layer-list来打造自己想要的背景效果
- Ubuntu上搭建并配置gitweb
- android Studio 引用fresco 出现的问题
- 安装第三方模块
- 第六届河南省程序设计大赛
- <<程序员面试宝典>>读书笔记 4
- radio的选中
- 浅谈HTTP中Get与Post的区别
- d3.js——树状图的绘制
- [转]iOS 30个动画详细解释