/*
* 313. Super Ugly Number
* 2016-7-4 by Mingyang
* http://www.cnblogs.com/Liok3187/p/5016076.html
* 跟ugly number II是一样的原理,但是我在自己做的时候遇到了同时出现两个14的情况(因为两种prime的组合
* 可以达到这个结果,我就用HashSet过滤,殊不知过滤以后另一个的计数器的值不++了
* 所以参考了大神的代码。如下所示:
*/
public static int nthSuperUglyNumber(int n, int[] primes) {
int[] dp = new int[n + 1], count = new int[primes.length];
int dpIndex = 1, minIndex = -1;
dp[0] = 1;
while (dpIndex <= n) {
int min = Integer.MAX_VALUE;
for (int i = 0; i < primes.length; i++) {
int tmp = dp[count[i]] * primes[i];
if (tmp < min) {
min = tmp;
minIndex = i;
}
}
count[minIndex]++;
//这里的count是指对应的primes的number的计数,可以为3,因为他不表示prime,只表示dp的index
if (min != dp[dpIndex - 1]) {
dp[dpIndex] = min;
dpIndex++;
}
}
return dp[n - 1];
}