主题说明:
只包含因子2、3和5的数称为丑数(Ugly Number )。 例如6、8是丑陋的数,但14因为含有因子7,所以不是。 习惯上认为1是第一个丑陋的数。 从小到大求出第n个丑数。
分析:
首先,我写了从1开始判断自然数是否是丑数,直到找到第n个丑数。 这个方法明显需要时间。 (判断一个数是否是丑数的想法:如果一个数可以被2整除,如果它可以连续被2整除,可以连续被3整除; 如果能被5整除的话,就用5除尽。 如果最后我们得到的是1,那个数量就是丑陋的数量,否则就不一样了。 )
想法:
只含有因子2、3、5的数称为丑数。 也就是说,一个丑数一定是某个丑数乘以2、3、5。 将现有丑数保存为一个数组,计算之后的丑数。 (牺牲空间以换取时间)
该方法的关键是排序,因为每个丑数是另一个丑数乘以2/3/5,所以要存储所有丑数,记住前面的下标,如果乘以前面数的2/3/5的丑数已经在后面使用,则将对应的下标前移一个
解答:
公共类解决方案{
publicintgetuglynumber _ solution (intindex ) {
if (索引=6)返回索引;
int i2=0,i3=0,i5=0;
int[] dp=new int[index];
dp[0]=1;
for(intI=1; I
DP[I]=math.min(DP[I2]*2,math.min ) dp[i5]*5,dp[i5]*5)//其中最小的是下一个丑数
//将已存在的数量向前移动
if(DP[I]==DP[i2]*2) I2;
if(DP[I]==DP[I3]*3) i3;
if(DP[I]==DP[I5]*5) i5;
}
返回DP [ index-1 ];
}
}
执行结果
在线编程的主题是你的逻辑思维,不可能让你写这么多代码,所以我相信代码一定越简洁越好。