一、题目
把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。例如 6、8 都是丑数,但 14 不是,因为它包含质因子 7。 习惯上我们把 1 当做是第一个丑数。求按从小到大的顺序的第 N 个丑数。
二、分析及代码
1. 标记位置 + 依次求解
(1)思路
由于丑数只包含质因子 2、3 和 5,可通过将这 3 个因子相乘,按由小到大的顺序获得各个丑数。
在计算过程中,下一丑数来自于已生成的某个丑数乘以 2、3 或 5,而已生成的丑数数组是有序的,可以设计 3 个标记,分别记录最近一次与各因子相乘生成所需丑数时所用数据的位置,从而避免重复的运算。
(2)代码
import java.util.*;
public class Solution {
public int GetUglyNumber_Solution(int index) {
if (index <= 0)
return 0;
ArrayList<Integer> uglyNums = new ArrayList<>();
uglyNums.add(1);
int i2 = 0, i3 = 0, i5 = 0;
int num2 = uglyNums.get(i2++) * 2;
int num3 = uglyNums.get(i3++) * 3;
int num5 = uglyNums.get(i5++) * 5;
for (int i = 1; i < index; i++) {
int num = Math.min(num2, Math.min(num3, num5));
uglyNums.add(num);
if (num == num2)
num2 = uglyNums.get(i2++) * 2;
if (num == num3)
num3 = uglyNums.get(i3++) * 3;
if (num == num5)
num5 = uglyNums.get(i5++) * 5;
}
return uglyNums.get(index - 1);
}
}
(3)结果
运行时间:21ms,占用内存:9532k。
三、其他
暂无。