class Solution {
public int nthSuperUglyNumber(int n, int[] primes) {
//超级丑数就是一个所有质因数都出现在primes数组中的正整数
//它不是说所有的因数都是质数,是质数的因数都出现在primes中
int[] dp = new int[n + 1];
//m个提供的质因数
int m = primes.length;
//初始值为0,default
int[] pointers = new int[m];
int[] nums = new int[m];
//把nums的每个数字都初始化为1
Arrays.fill(nums, 1);
for (int i = 1; i <= n; i ++) {
//使用流的方式获取数组nums的最小值
int minNum = Arrays.stream(nums).min().getAsInt();
//用这种方式实现排序,并放入dp中
dp[i] = minNum;
for (int j = 0; j < m; j ++) {
//同样是实现排序效果,对于nums数组
//直到最后一个nums[m]被赋值前,minNum都是1
//在第一次遍历完j for循环之后,nums中的每个数都被更新,不再有1
//在之后的遍历中,nums数组中只有一个位置会被修改,除非相等
if (nums[j] == minNum) {
pointers[j] ++;
//因为dp中的数字就是满足超级丑数性质的按升序排列的
//同时控制乘积不会出现重复值
nums[j] = dp[pointers[j]] * primes[j];
}
}
}
return dp[n];
}
}