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); } }