《剑指offer》丑数

【 声明:版权所有,转载请标明出处,请勿用于商业用途。  联系信箱:libin493073668@sina.com】


题目链接:http://www.nowcoder.com/practice/6aa9e04fc3794f68acf8778237ba065b?rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking


题目描述
把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。

思路
我们可以使用最直观的连除因子法来得到结果,但是这在时间效率上并不理想,但好处是没有额外的空间消耗
我们也可以使用空间换时间的做法,我们开一个数组来有序的保存所有的丑数,因为我们的前提是保证了这个数组的有序性,所以我们可以通过三个指针来循环计算


class Solution
{
	public:
		int GetUglyNumber_Solution(int n)
		{
			if(n<=0)
				return 0;
			int *uglyNum = new int[n];
			uglyNum[0] = 1;
			int *ugly2 = uglyNum;
			int *ugly3 = uglyNum;
			int *ugly5 = uglyNum;
			int cnt = 1;
			while(cnt<n)
			{
				int _min = min(*ugly2*2,min(*ugly3*3,*ugly5*5));
				uglyNum[cnt] = _min;
				while(*ugly2*2<=uglyNum[cnt])
					++ugly2;
				while(*ugly3*3<=uglyNum[cnt])
					++ugly3;
				while(*ugly5*5<=uglyNum[cnt])
					++ugly5;
				++cnt;
			}
			int ans = uglyNum[cnt-1];
			delete []uglyNum;
			return ans;
		}
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值