这是剑指offer上的一道算法题:
把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
思路:
比较容易想到的是,对于数组arr,某些位置t2,t3,t5的数分别乘以2,3,5以后取最小值即为下一个丑数。
比如:
arr[0] = 1;
开始时,t2 = 0,t3 = 0, t5 = 0,
明显是arr[t2]*2最小,所以arr[0+1] = 2.
但是需要注意的是,如果arr[i] == arr[i-1]则舍弃arr[i].
比如前6个丑数:1,2,3,4,5,6
但是按上述算法第七个丑数为6,因为6已经存在,所以需要舍弃6。
代码实现如下:
import java.util.Scanner;
/**
* @author Mengjun Li
* @create 2017/10/14
* @since 1.0.0
*/
public class Main1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
int n = sc.nextInt();
System.out.println(solve(n));
}
}
public static int solve(int index) {
if (index < 7)
return index;
//定义三个指针,分别表示当前位置的值应该和2,3,5相乘
int t2 = 0, t3 = 0, t5 = 0;
int i = 1;
int[] arr = new int[index];
arr[0] = 1;
while (i < index) {
arr[i] = Math.min(arr[t2] * 2, Math.min(arr[t3] * 3, arr[t5] * 5));
if (arr[i] == arr[t2] * 2)
t2++;
else if (arr[i] == arr[t3] * 3)
t3++;
else
t5++;
//arr[i]不能和前一个丑数arr[i-1]相等,如果相等,对应的t2,t3,或者t5++,i则不变
if (arr[i] > arr[i - 1])
i++;
}
return arr[i - 1];
}
}
测试结果:
输入
7
输出
8
1382

被折叠的 条评论
为什么被折叠?



