丑数:只能因式分解为2,3,5整除的数
算法:求第index个丑数
常规思维
依次遍历,判断每个数是否为丑数。确定是效率低,存在大量重复计算。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| public boolean Ugly(int N) {
while(N%2==0) N/=2; while(N%3==0) N/=3; while(N%5==0) N/=5; return N==1?true:false; }
|
优化方法
参考
利用前面计算的丑数序列,* 2,* 3,* 5取最小值为下一个丑数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| import java.util.*; public class Solution { public int GetUglyNumber_Solution(int index) { if(index<=0) return 0; ArrayList<Integer> list = new ArrayList<Integer>(); list.add(1); int i2=0,i3=0,i5=0; while(list.size()<index){ int n2=list.get(i2)*2; int n3=list.get(i3)*3; int n5=list.get(i5)*5; int min = Math.min(n2,Math.min(n3,n5)); list.add(min); if(min==n2) i2++; if(min==n3) i3++; if(min==n5) i5++; } return list.get(list.size()-1); } }
|