int nthSuperUglyNumber(int n, vector<int>& primes) { vector<int> uglies(n), ugly_by_prime(primes), idx(primes.size()); uglies[0] = 1; for (int i = 1; i < n; ++i) { int min_val = *min_element(ugly_by_prime.begin(), ugly_by_prime.end()); uglies[i] = min_val; for (int k = 0; k < primes.size(); ++k) { if (min_val == ugly_by_prime[k]) { ugly_by_prime[k] = primes[k] * uglies[++idx[k]]; } } } return uglies[n - 1]; }
int nthSuperUglyNumber(int n, vector<int>& primes) { priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> heap; vector<int> uglies(n), idx(primes.size()), ugly_by_last_prime(n); uglies[0] = 1; for (int i = 0; i < primes.size(); ++i) { heap.emplace(primes[i], i); } for (int i = 1; i < n; ++i) { int k; tie(uglies[i], k) = heap.top(); heap.pop(); ugly_by_last_prime[i] = k; while (ugly_by_last_prime[++idx[k]] > k); // average time: O(k) heap.emplace(uglies[idx[k]] * primes[k], k); } return uglies[n - 1]; }
int nthUglyNumber(int n){ vector<int> uglies(n); uglies[0] = 1; int f2=2, f3=3, f5=5; int idx2=0, idx3=0, idx5=0; for(int i=1; i<n; i++){ int min_val = min(min(f2,f3),f5); uglies[i] = min_val; if (min_val%2==0) { f2 = 2*uglies[++idx2]; } if (min_val%3==0) { f3 = 3*uglies[++idx3]; } if (min_val%5==0) { f5 = 5*uglies[++idx5]; } } return uglies[n-1]; }
int nthSuperUglyNumber(int n, vector<int>& primes) { priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> heap; vector<int> uglies(n), idx(primes.size()); uglies[0] = 1; for (int k = 0; k < primes.size(); ++k) { heap.emplace(primes[k], k); } for (int i = 1; i < n; ++i) { int k; tie(uglies[i], k) = heap.top(); while (heap.top().first == uglies[i]) { // worst time: O(klogk) tie(uglies[i], k) = heap.top(); heap.pop(); heap.emplace(primes[k] * uglies[++idx[k]], k); } } return uglies[n - 1]; }
int nthSuperUglyNumber(int n, vector<int>& primes) { priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> heap; unordered_set<int> ugly_set{1}; vector<int> uglies(n), idx(primes.size()); uglies[0] = 1; for (int k = 0; k < primes.size(); ++k) { heap.emplace(primes[k], k); ugly_set.emplace(primes[k]); } for (int i = 1; i < n; ++i) { int k; tie(uglies[i], k) = heap.top(); heap.pop(); while (ugly_set.count(primes[k] * uglies[idx[k]])) { ++idx[k]; } heap.emplace(primes[k] * uglies[idx[k]], k); ugly_set.emplace(primes[k] * uglies[idx[k]]); } return uglies[n - 1]; }