【 声明:版权所有,转载请标明出处,请勿用于商业用途。 联系信箱:libin493073668@sina.com】
题目描述
把只包含因子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; } };
版权声明:本文为博主原创文章,如果转载,请注明出处
原文地址:http://blog.csdn.net/libin1105/article/details/48391795