题目:
我们把只包含因子2, 3,5的数称作丑数。求从小到大的顺序的第1500个丑数。
思路:
第一种思路就是挨个遍历,查看每个数是不是丑数,当找到第1500个丑数时返回。
还有另一种思路,仅仅对丑数进行处理。我们从题目可知,每个丑数都是由其他丑数乘以2,3,5获得的。这样我们把求得的丑数都保存下来,用之前的丑数分别乘以2,3,5,找出这三这种最小的并且大于当前最大丑数的值,即为下一个我们要求的丑数。
public class Solution {
public static void main(String[] args) {
int index = 1500;
int UglyNumofIndex = getUglyNum(index);
System.out.println(UglyNumofIndex);
}
public static int getUglyNum(int index){
if(index <= 0)
return 0;
if(index == 1)
return 2;
if (index==2)
return 3;
if (index==3)
return 5;
int t2 = 1, t3 = 0, t5 = 0;
int [] res = new int[index];
res[0] = 2;
res[1] = 3;
res[2] = 5;
int max = 5;
for(int i = 3; i<index; i++){
res[i] = Math.min(res[t2]*2, Math.min(res[t3]*3, res[t5]*5));
if(res[i] == res[t2]*2) t2++;
if(res[i] == res[t3]*3) t3++;
if(res[i] == res[t5]*5) t5++;
}
return res[index-1];
}
}
注意代码中的t2,t3和t5。三个值表示当前哪个值乘以对应的倍数能够大于当前的最大丑数。如开头,最大值为res[2]==5,那么乘以2大于5的丑数序号至少为1,res[1]==3×2>5.同理乘以3大于5的是res[0]==2×3>5,乘以5大于5的是res[0]==2×5>5.
每当选中一个t值,证明新的最大值等于当前序号对应值乘以倍数,因此更新序号,也就是+1.