Ugly Number II
2016, Apr 20
Ugly Number II
@(算法)[算法, Priority Queue]
这一题怎样用一句话描述?
找出第N个丑数(丑数的定义是:它只能有2,3,5这三个因子,也就是说只能被2,3,5或者2,3,5的倍数整除)
用到什么算法?什么数据结构?
用了不准备肯定想不到的方法,数组。
通过这题学到了什么?
又是一道不准备就肯定做不出来的题目,首先丑数的定义就很难理解,或者说很难用程序实现。什么叫“只能被2,3,5或者2,3,5的倍数整除”呢?为了不把脑子烧糊,我还是决定用一个更简单,并且效率更高的方法做,只要看一下下面这三个序列就能明白:
1 X 2 2 X 2 3 X 2 4 X 2 5 X 2 6 X 2...
1 X 3 2 X 3 3 X 3 4 X 3 5 X 3 6 X 3...
1 X 5 2 X 5 3 X 5 4 X 5 5 X 5 6 X 5...
因为每一个丑数,都可以通过乘2、乘3或者乘5的到,所以,我们用1乘2、乘3或者乘5就得到了2、3、5,用2乘2、乘3或者乘5就得到了4、6、10,以此类推……它们的到的结果都是丑数,而我们只需要每次拿到结果中最小的那个,再用它乘2、乘3或者乘5就又能得到3个候选值,然后再取最小,再乘2、乘3或者乘5……
代码如下:
public int nthUglyNumber(int n) {
// Write your code here
List<Integer> uglyNumber = new ArrayList<>(n);
uglyNumber.add(1);
int i2 = 0, i3 = 0, i5 = 0;
while (uglyNumber.size() < n) {
int m2 = uglyNumber.get(i2) * 2;
int m3 = uglyNumber.get(i3) * 3;
int m5 = uglyNumber.get(i5) * 5;
int mn = Math.min(m2, Math.min(m3, m5));
if (mn == m2) i2++;
if (mn == m3) i3++;
if (mn == m5) i5++;
uglyNumber.add(mn);
}
return uglyNumber.get(n - 1);
}
好吧,其实代码基本上是照抄的这个博客
可能(已经)遇到的BUG有?
不准备就肯定跪的题,哪来的BUG?