面试题38:丑数
2015-12-31 10:27
253 查看
题目:
我们把只包含因子2,3和5的数称作丑数。求按从小到大的顺序的第1500个丑数。例如6,8是丑数,14不是丑数。习惯上我们把1当作第一个丑数。
边界条件及异常:
index小于等于0。
思路:
下一个丑数肯定是前面某一个丑数uglyNumbers[mult2Index]乘以2,某一个丑数uglyNumbers[mult3Index]乘以3,某一个丑数uglyNumbers[mult5Index]乘以5的最小的值。
所以需要将前面的丑数全部存下来。
时间复杂度:O(n)
空间复杂度:O(n)
我们把只包含因子2,3和5的数称作丑数。求按从小到大的顺序的第1500个丑数。例如6,8是丑数,14不是丑数。习惯上我们把1当作第一个丑数。
边界条件及异常:
index小于等于0。
思路:
下一个丑数肯定是前面某一个丑数uglyNumbers[mult2Index]乘以2,某一个丑数uglyNumbers[mult3Index]乘以3,某一个丑数uglyNumbers[mult5Index]乘以5的最小的值。
所以需要将前面的丑数全部存下来。
时间复杂度:O(n)
空间复杂度:O(n)
#include <iostream> #include <vector> #include <queue> #include <string> #include <stack> #include <algorithm> #include <hash_set> //for hashtable #include <hash_map> #include <set> #include <ctime> using namespace std; int MinOfThree(int num1, int num2, int num3) { int m = min(num1, num2); return min(m, num3); } int GetUglyNumber(int index) { if (index <= 0) return 0; vector<int> uglyNumbers(index); uglyNumbers[0] = 1; int nextIndex = 1; int mult2Index = 0, mult3Index = 0, mult5Index = 0; while (nextIndex < index) { uglyNumbers[nextIndex] = MinOfThree(uglyNumbers[mult2Index] * 2, uglyNumbers[mult3Index] * 3, uglyNumbers[mult5Index] * 5); while (uglyNumbers[mult2Index] * 2 <= uglyNumbers[nextIndex]) ++mult2Index; while (uglyNumbers[mult3Index] * 3 <= uglyNumbers[nextIndex]) ++mult3Index; while (uglyNumbers[mult5Index] * 5 <= uglyNumbers[nextIndex]) ++mult5Index; ++nextIndex; } return uglyNumbers[nextIndex - 1]; } int main() { cout << GetUglyNumber(7) << endl; return 0; }
相关文章推荐
- 程序员面试技巧总结
- 对程序员非常重要的24个软技能
- 面试中的Singleton
- 一个程序员老总的年终总结2015版
- 黑马程序员——常用API
- 黑马程序员——java面向对象的常见问题
- 面试题8 判断一个 String 是不是另一个 String 旋转而来
- 黑马程序员——java基础语法的常见面试题
- 黑马程序员——螺旋方阵的打印
- 黑马程序员——围圈报数的算法实现
- 应届生高薪就业的背后(长点面试的经验)
- 工作三年的java程序员修行之路
- 面试题37:把数组排成最小的数
- 面试题36:从1到n整数中1出现的次数
- java程序员工作三年的修行之路
- 面试干货
- 程序员如何谋划出月薪3万
- 程序员到底需要学习多少东西??
- C#与.NET程序员面试宝典 Day2
- 第一份程序员的自述