leetcode-丑数 II
题目链接:题目链接
题目大意就是,给定一个数字n,获取到第n个丑数,关于丑数的定义可以参考一下上一篇博客。
关于这个问题,我是不太会做的,之前听一个同学说是打表做出来的,不过还是要解决问题的,下面介绍一下之前看过的一种思路: 三指针,对于这个题目来说对于大部分丑数来说,他都可以由一个比较小的丑数通过乘以2/3/5的形式得到,所以我们可以姑且看作是三匹马,下等马,中等马,上等马,三种马的奔跑速度分别是2, 3, 5,可以让三匹马一起出发,往后跑,但是如果其中一匹马跑得过快的话,需要停下来等等后面的马,所以就定义了三个指针,分别乘以2, 3, 5得到后面的丑数
public int nthUglyNumber(int n) {
//定义三个指针
int a = 0, b = 0, c = 0;
//定义丑数数组
int[] arr = new int[1693];
//设置初始值
arr[0] = 1;
//开始计算丑数
for(int i = 1; i < 1693; i++) {
int n2 = arr[a] * 2, n3 = arr[b] * 3, n5 = arr[c] * 5;
arr[i] = Math.min(n2, Math.min(n3, n5));
if(arr[i] == n2) {
a++;
}
if(arr[i] == n3) {
b++;
}
if(arr[i] == n5) {
c++;
}
}
return arr[n-1];
}
思路还是比较牛逼的,理论上还属于dp