题目描述
把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
思路1:
逐个判断每个整数是不是丑数,但这样效率太低了,还是给出判断某个整数是否是丑数的代码:
bool isugly(int number) { while(number%2==0) number/=2; while(number%3==0) number/=3; while(number%5==0) number/=5; return (number==1)?true:false;
思路二:
创建数组,逐步顺序增加已经找到的丑数,用空间换时间的算法
根据丑数的定义,丑数应该是另一个丑数乘以2,3或5得到的(1除外)。因此我们可以利用这个来扩充排序数组。
1、将已有的丑数M2,M3,M5(初始时都指向1)分别乘以2,3,5,取其中的最小值作为下一个丑数
2、然后更新M2,M3,M5。更新规则是,1中取的最小值对应M2,则M2++,若对应M3,则M3++.若对应M5,则M5++
3、重复1,2,直到数组中丑数数量达到要求。
代码:
class Solution { public: int GetUglyNumber_Solution(int index) { if(index<=0) return 0; int *p=new int[index]; p[0]=1; int nextindex=1; int *p2=p; int *p3=p; int *p5=p; while(nextindex<index) { int min=Min(*p2*2,*p3*3,*p5*5); p[nextindex]=min; if(*p2*2<=p[nextindex]) p2++; if(*p3*3<=p[nextindex]) p3++; if(*p5*5<=p[nextindex]) p5++; ++nextindex; } int ugly=p[nextindex-1]; delete[] p; return ugly; } int Min(int number1,int number2,int number3) { int min=(number1<number2)?number1:number2; min=(min<number3)?min:number3; return min; } };