面试题38:丑数

题目:

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值