[Leetcode] Ugly Number II, Solution
2015-10-06 13:21
525 查看
Write a program to find the
[Thoughts]这就是多链表Merge Sort的一个扩展题。对于任意一个ugly number - K, 2*K, 3*K, 和5*K都是ugly number,所以说新的ugly number都是从已有的ugly number上,通过与{2,3,5}相乘而产生的。如果Ugly Number: 1, 2, 3, 4, 5, 6, 8, 10, ..............那么 1*2 2*2 3*2 4*2 5*2 6*2 8*2 10*2 .............. *2 1*3 2*3 3*3 4*3 5*3 6*3 8*3 10*3 .............. *3 1*5 2*5 3*5 4*5 5*5 6*5 8*5 10*5 .............. *5都是ugly number。只要不断把新产生的ugly number通过merge sort添加到原有的ugly number数组中就可以了,直到找到第N个。[code]1: class Solution { 2: public: 3: int nthUglyNumber(int n) { 4: vector<int> uglys(1, 1); 5: int p2 = 0, p3 = 0, p5 = 0; 6: while (uglys.size() < n) { 7: int ugly2 = uglys[p2] * 2, ugly3 = uglys[p3] * 3, ugly5 = uglys[p5] * 5; 8: int min_v = min(ugly2, min(ugly3, ugly5)); 9: if (min_v == ugly2) ++p2; 10: if (min_v == ugly3) ++p3; 11: if (min_v == ugly5) ++p5; 12: if(min_v != uglys.back()) { 13: // skip duplicate 14: uglys.push_back(min_v); 15: } 16: } 17: return uglys[n-1]; 18: } 19: };
考虑到通用性,可以扩展如下,可以支持任意长度的因子数组factors。
从空间的优化来说,没有必要用一个uglys的数组保存所有的ugly number,尤其是当n是个非常大的数字。对于indexes指针扫过的ugly number,都可以丢掉了。不过,懒得写了。
n-th ugly number.Ugly numbers are positive numbers whose prime factors only include
2, 3, 5. For example,
1, 2, 3, 4, 5, 6, 8, 9, 10, 12is the sequence of the first
10ugly numbers.Note that
1is typically treated as an ugly number.
[Thoughts]这就是多链表Merge Sort的一个扩展题。对于任意一个ugly number - K, 2*K, 3*K, 和5*K都是ugly number,所以说新的ugly number都是从已有的ugly number上,通过与{2,3,5}相乘而产生的。如果Ugly Number: 1, 2, 3, 4, 5, 6, 8, 10, ..............那么 1*2 2*2 3*2 4*2 5*2 6*2 8*2 10*2 .............. *2 1*3 2*3 3*3 4*3 5*3 6*3 8*3 10*3 .............. *3 1*5 2*5 3*5 4*5 5*5 6*5 8*5 10*5 .............. *5都是ugly number。只要不断把新产生的ugly number通过merge sort添加到原有的ugly number数组中就可以了,直到找到第N个。[code]1: class Solution { 2: public: 3: int nthUglyNumber(int n) { 4: vector<int> uglys(1, 1); 5: int p2 = 0, p3 = 0, p5 = 0; 6: while (uglys.size() < n) { 7: int ugly2 = uglys[p2] * 2, ugly3 = uglys[p3] * 3, ugly5 = uglys[p5] * 5; 8: int min_v = min(ugly2, min(ugly3, ugly5)); 9: if (min_v == ugly2) ++p2; 10: if (min_v == ugly3) ++p3; 11: if (min_v == ugly5) ++p5; 12: if(min_v != uglys.back()) { 13: // skip duplicate 14: uglys.push_back(min_v); 15: } 16: } 17: return uglys[n-1]; 18: } 19: };
考虑到通用性,可以扩展如下,可以支持任意长度的因子数组factors。
1: class Solution { 2: public: 3: int nthUglyNumber(int n) { 4: vector<int> factors{ 2, 3, 5}; 5: return nthUglyNumberGeneral(n, factors); 6: } 7: int nthUglyNumberGeneral(int n, vector<int>& factors) { 8: vector<int> uglys(1,1); 9: vector<int> indexes(factors.size(), 0); 10: while(uglys.size() < n) { 11: int min_v = INT_MAX; 12: int min_index = 0; 13: for(int k =0; k< factors.size(); k++) { 14: int temp = uglys[indexes[k]] * factors[k]; 15: if(temp < min_v) { 16: min_v = temp; 17: min_index = k; 18: } 19: } 20: indexes[min_index]++; 21: // need to avoid duplicate ugly number 22: if(uglys[uglys.size()-1] != min_v) { 23: uglys.push_back(min_v); 24: } 25: } 26: return uglys[n-1]; 27: } 28: };
从空间的优化来说,没有必要用一个uglys的数组保存所有的ugly number,尤其是当n是个非常大的数字。对于indexes指针扫过的ugly number,都可以丢掉了。不过,懒得写了。
相关文章推荐
- Word Pattern
- 手动编译httpd
- Maven的Dependencies和dependencyManagement区别
- 拥抱javascript的promise
- Hbase笔记三:Hbase基本命令
- Vsphere-client 克隆复制虚拟机
- 你所知道好玩有趣的 iOS URL schemes 有哪些?
- React 事件处理函数
- 括号配对问题
- 如何用javascript 的eval动态执行一个需要传对象参数的函数
- notepad++、sublime text、eclipse 配置python开发环境
- Linux pipe函数介绍
- linux上github的简单使用
- Android Chronometer实现时分秒的显示
- block的常考面试题
- 如果你不了解未来年轻人的生活方式,谈什么立业!
- 结对项目博客——四则运算题目生成程序的改进与分析(附加题)
- 使用SAX解析XML文件
- Synchronized(对象锁)和Static Synchronized(类锁)的区别
- (转)Synchronized(对象锁)和Static Synchronized(类锁)的区别