package com.interview.dynamic;
import java.util.PriorityQueue;
/**
* Date 03/08/2016
* @author Tushar Roy
*
* Find nth ugly number.
*
* https://leetcode.com/problems/ugly-number-ii/
* https://leetcode.com/problems/super-ugly-number/
* http://www.geeksforgeeks.org/ugly-numbers/
*/
public class UglyNumbers {
static class Node implements Comparable<Node> {
int inputIndex;
int index;
int val;
Node (int inputIndex, int index, int val) {
this.index = index;
this.val = val;
this.inputIndex = inputIndex;
}
@Override
public int compareTo(Node other) {
return this.val - other.val;
}
}
public int nthSuperUglyNumber1(int n, int[] primes) {
PriorityQueue<Node> pq = new PriorityQueue<>();
for (int i = 0; i < primes.length; i++) {
pq.offer(new Node(i, 0, primes[i]));
}
int[] val = new int[n];
val[0] = 1;
for (int i = 1; i < n; ) {
Node node = pq.poll();
if (val[i-1] != node.val) {
val[i] = node.val;
i++;
}
node.index = node.index + 1;
node.val = primes[node.inputIndex]*val[node.index];
pq.offer(node);
}
return val[n - 1];
}
int ugly(int n){
int arr[] = new int[n];
int count = 1;
arr[0] = 1;
int i2 = 0;
int i3 = 0;
int i5 = 0;
while(count < n){
int minNumber = min(arr[i2] * 2, arr[i3] * 3, arr[i5] * 5);
if(minNumber == arr[i2]*2){
i2++;
}
if(minNumber == arr[i3]*3){
i3++;
}
if(minNumber == arr[i5]*5){
i5++;
}
arr[count++] = minNumber;
}
return arr[n-1];
}
private int min(int a,int b, int c){
int l = Math.min(a, b);
return Math.min(l, c);
}
public static void main(String args[]) {
UglyNumbers ugly = new UglyNumbers();
int result = ugly.ugly(150);
System.out.println(result);
int[] primes = {2, 3, 7, 11};
System.out.print(ugly.nthSuperUglyNumber1(17, primes));
}
}