Problem: Ugly Number II

Posted by Marcy on February 18, 2015

Question

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.

Solution

We have an array k of first n ugly number. We only know, at the beginning, the first one, which is 1. Then k[1] = min( k[0]x2, k[0]x3, k[0]x5). The answer is k[0]x2. So we move 2’s pointer to 1. Then we test: k[2] = min( k[1]x2, k[0]x3, k[0]x5). And so on. Be careful about the cases such as 6, in which we need to forward both pointers of 2 and 3.

Code

public class Solution {
  public int nthUglyNumber(int n) {
    int [] uglyList = new int[n];

    uglyList[0] = 1;
    int index2 = 0;
    int index3 = 0;
    int index5 = 0;

    for(int i=1; i<uglyList.length; i++) {
      int nextUgly2 = uglyList[index2]*2;
      int nextUgly3 = uglyList[index3]*3;
      int nextUgly5 = uglyList[index5]*5;

      uglyList[i] = Math.min(Math.min(nextUgly2, nextUgly3), nextUgly5);

      if(uglyList[i] == nextUgly2)
        index2 ++;
      if(uglyList[i] == nextUgly3)
        index3 ++;
      if(uglyList[i] == nextUgly5)
        index5 ++;
    }

    return uglyList[n-1];
  }
}

Performance

O(n)