解题需要搞清楚两个概念即可,第一是什么是丑数;第二就是丑数从1开始往后,有什么规律,其实这些丑数都是由2、3、5相乘生成的,所以这里就需要定义三个变量分别标识由2、3、5生成的丑数。具体解析过程参考代码注释
package likou;
/*
* 264:丑数
* 题干:
* 给你一个整数n ,请你找出并返回第n个丑数
* 丑数就是只包含质因数 2、3 或 5 的正整数
*/
public class Demo264 {
/*
* 解题思路:
* 首先要明确丑数是什么:丑数是因子中仅仅包含2、3、5的数
* 丑数序列的第一个数肯定是1,
* 第二是2,第三是3,第四个数是4(4=2*2),第五个数字是5,
* 相当于是1,3,5分别轮询一遍,每次都是取最小,然后再对比
* 如果是其中某一个元素的倍数,则将对应的指针加1
* 如果要降低降低控件利用率,其实可以不用定义dp数组,直接定义三个变量即可
*/
public int nthUglyNumber(int n) {
int[] dp = new int[n+1];
dp[1] = 1;
int p1 = 1; //2
int p2 = 1; //3
int p3 = 1; // 5
for(int i=2;i<=n;i++) {
int num1 = dp[p1]*2;
int num2 = dp[p2]*3;
int num3 = dp[p3]*5;
int temp = Math.min(Math.min(num1, num2), num3);
dp[i] = temp;
if(dp[i] == num1) {
p1++;
}
if(dp[i] == num2) {
p2++;
}
if(dp[i] == num3) {
p3++;
}
}
return dp[n];
}
public static void main(String args[]) {
Demo264 demo = new Demo264();
System.out.println(demo.nthUglyNumber(10));
}
}