问题定义:
丑数:把只包含因子2,3和5的数称为丑数,习惯上把1作为第一个丑数。
问题:输出第n个丑数。
思路:
第一种想法:常规想法,因为只包含因子2,3和5,所以丑数职能被2,3和5整除,然后直接用循环一个数一个数的判断,直到找到第n个数。
第二种想法:根据丑数的定义,每一个丑数(1除外)都是前一个丑数乘以2,3或者5得到的,在得到这个结论后我们可以将前面的丑数存起来,然后后通过前一个计算后一个丑数,直到找到第n个丑数,这种思路的需要存储的丑数是从小到大顺序的。例如,第一个丑数为1,那么1*2,1*3,1*5,就是下一个丑数的候选,下一个丑数得大就是1*2,1*3,1*5的最小者,接下来,将1*2装入数组,这时候,丑数数组中2是最大的,2乘以2,3,5也会得到三个丑数,我们将怎么选择下一个丑数呢?将取2得到丑数和之前的丑数最小的那个丑数为下一个丑数,以此类推
代码:
public class Solution {
public int GetUglyNumber_Solution(int index) {
if(index <= 0){
return 0;
}
int [] uglys = new int[index];
uglys[0] = 1;
int nextUglyIndex = 1;
int ugly2 = 0;
int ugly3 = 0;
int ugly5 = 0;
while(nextUglyIndex < index){
int min = Min(uglys[ugly2]*2,uglys[ugly3]*3,uglys[ugly5]*5);
uglys[nextUglyIndex] = min;
while(uglys[ugly2]*2 <= uglys[nextUglyIndex])
++ugly2;
while(uglys[ugly3]*3 <= uglys[nextUglyIndex])
++ugly3;
while(uglys[ugly5]*5 <= uglys[nextUglyIndex])
++ugly5;
++nextUglyIndex;
}
int ugly = uglys[nextUglyIndex - 1];
return ugly;
}
public int Min (int num1,int num2, int num3){
int min = (num1 < num2) ? num1 : num2;
min = (min < num3) ? min : num3;
return min;
}
}