题目:我们把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第1500个丑数
暴力求解方法虽然简单,但是时间复杂度太高。剑指offer上有如下代码:
int ThreeMin(int a, int b, int c){
int result = a<b?a:b;
result = result<c?result:c;
return result;
}
int GetUglyNumber(int index){
if(index <= 0)
return 0;
int *pUglyNumbers = new int[index+1];
pUglyNumbers[0] = 1;
int *p2 = pUglyNumbers;
int *p3 = pUglyNumbers;
int *p5 = pUglyNumbers;
int nextUglyIndex = 1;
while(nextUglyIndex < index+1){//之所以是index+1,是因为数组pUglyNumbers第0个位置被填充为1,所以元素都相应后移一位,才可以
int minNum = ThreeMin(*p2*2, *p3*3, *p5*5);
pUglyNumbers[nextUglyIndex] = minNum;
while(*p2*2 <= pUglyNumbers[nextUglyIndex])
++p2;
while(*p3*3 <= pUglyNumbers[nextUglyIndex])
++p3;
while(*p5*5 <= pUglyNumbers[nextUglyIndex])
++p5;
++nextUglyIndex;
}
int ugly = pUglyNumbers[nextUglyIndex-1];
delete []pUglyNumbers;
return ugly;
}