An approach is to check every number if it is an ugly number, until we meet the nth ugly number.
An efficient way is to construct and enumerate all n ugly number and return the last one.
public class Solution {
public int nthUglyNumber(int n) {
// an array list to save ugly numbers in sequence
ArrayList<Integer> uglySeq = new ArrayList<>();
// the first ugly number is 1
uglySeq.add(1);
// i, j, and k are three pointers point to ugly number generated by multiplication of 2, 3, and 5 respectively
int i = 0, j = 0, k = 0;
while (uglySeq.size() < n) {
// choose minimum in order to maintain the sequence
int nextUgly = Math.min(2*uglySeq.get(i), Math.min(3*uglySeq.get(j), 5*uglySeq.get(k)));
uglySeq.add(nextUgly);
// update pointers
if (2*uglySeq.get(i) == nextUgly) i++;
if (3*uglySeq.get(j) == nextUgly) j++;
if (5*uglySeq.get(k) == nextUgly) k++;
}
return uglySeq.get(n-1);
}
}