题目:
我们把只包含因子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;
}