Write a program to find the n
-th ugly number.
Ugly numbers are positive numbers whose prime factors only include 2, 3, 5
. For example, 1, 2, 3, 4, 5, 6, 8, 9, 10, 12
is the sequence of the first 10
ugly numbers.
Note that 1
is typically treated as an ugly number, and n does not exceed 1690.
=====================================================
算法参考了, 核心思想就是所有的ugly number都可以通过 这个 ugly number 序列本身通过乘以2,3 或者 5 来得到,所有就有了 memorization 的过程,每一次选当前最小的放入 uglyNumber array当中
http://www.geeksforgeeks.org/ugly-numbers/
https://discuss.leetcode.com/topic/21791/o-n-java-solution
写这个博客是因为觉得自己的代码可读性更好一些
public class Solution {
public int nthUglyNumber(int n) {
int[] uglyNumbers = new int[n];
int idx2 = 0, idx3 = 0, idx5 = 0;
uglyNumbers[0] = 1;
for(int i = 1; i < n; i++){
int cur2 = uglyNumbers[idx2] * 2;
int cur3 = uglyNumbers[idx3] * 3;
int cur5 = uglyNumbers[idx5] * 5;
int cur = Math.min(Math.min(cur2, cur3), cur5);
// can't use if else here because sometimes cur2 == cur3 or vise versa, for example, when idx2 == 2, idx3 == 1, then uglyNumbers[idx2] * 2 == 3 * 2 == 6, uglyNumbers[idx3] * 3 == 2 * 3 == 6, in this case, both idx2 and idx3 should move forward, otherwise, there will be duplicate 6 in the uglyNumber array
if(cur == cur2)
idx2++;
if(cur == cur3)
idx3++;
if(cur == cur5)
idx5++;
uglyNumbers[i] = cur;
}
return uglyNumbers[n - 1];
}
}