题目描述
把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
解法
所谓丑数,即为只包含质因子2、3和5的数,通过将1分别乘以2 3 5,然后将结果继续乘以2 3 5,如此循环,即可得到丑数,只不过这样做既会乱序又会重复,不过我们可以通过这个思路进行改良,我们每次通过设置三个标志位去取分别乘以2 3 5的数,确保不会乱序,同时每次将当前最小的丑数插入数组内,保证不会重复,举例子来说就是:
初始状态:{t2,t3,t5}={1,1,1}
r[1] = 1->r[2] = min(12,13,15)=2,此时t2自加{t2,t3,t5}={2,1,1}
r[2] = 2->r[3] = min(22,13,15)=3,此时t3自加{t2,t3,t5}={2,2,1}
r[3] = 3->r[4] = min(22,23,1*5)=5,此时t3自加{t2,t3,t5}={2,2,2}
如此类推,具体实现代码如下:
import java.util.*;
public class Solution {
public int GetUglyNumber_Solution(int index) {
if(index == 0){
return 0;
}
int[] result = new int[index + 1];
int t2 = 1;
int t3 = 1;
int t5 = 1;
result[1] = 1;
for(int i = 2;i <= index;i++){
result[i] = Math.min(result[t2]*2,Math.min(result[t3]*3,result[t5]*5));
if(result[i] == result[t2]*2) t2++;
if(result[i] == result[t3]*3) t3++;
if(result[i] == result[t5]*5) t5++;
}
return result[index];
}
}```