int nthUglyNumber(int n) { if(n <= 0) return 0; vector<int> uglys(n, 1); int t2 = 0, t3 = 0, t5 = 0, l2 = 2, l3 = 3, l5 = 5; for(int i = 1; i < n; i++){ while(l2 <= uglys[i-1]) l2 = uglys[++t2] * 2; while(l3 <= uglys[i-1]) l3 = uglys[++t3] * 3; while(l5 <= uglys[i-1]) l5 = uglys[++t5] * 5; if(l2 <= l3 && l2 <= l5) { uglys[i] = l2; l2 = uglys[++t2] * 2; } else if(l3 <= l2 && l3 <= l5) { uglys[i] = l3; l3 = uglys[++t3] * 3; } else { uglys[i] = l5; l5 = uglys[++t5] * 5; } } return uglys[n-1]; }
int nthUglyNumber(int n) { vector<int> uglys(n); //first ugly number uglys[0]=1; int t2 = 0,t3=0,t5=0; for(int i = 1;i<n;i++) { //choose the minimum ugly number in the next uglys[i]= min(uglys[t2]*2,min(uglys[t3]*3,uglys[t5]*5)); //increase the index if(uglys[i]==uglys[t2]*2) t2++; if(uglys[i]==uglys[t3]*3) t3++; if(uglys[i]==uglys[t5]*5) t5++; } return uglys[n-1]; }
int nthSuperUglyNumber(int n, vector<int>& primes) { int k = primes.size(); vector<int> idxs(k, 0), uglys(n, INT_MAX); uglys[0] = 1; for (int nth = 1; nth < n; ++nth) { for (int idx = 0; idx < k; ++idx) { uglys[nth] = min( uglys[nth], primes[idx] * uglys[idxs[idx]]); } for (int idx = 0; idx < k; ++idx) { idxs[idx] += (uglys[nth] == primes[idx] * uglys[idxs[idx]]); } } return uglys.back(); }
int nthUglyNumberGeneral(int n, vector<int>& factors) { vector<int> uglys(1,1); vector<int> indexes(factors.size(), 0); while(uglys.size() < n) { int min_v = INT_MAX; int min_index = 0; for(int k =0; k< factors.size(); k++) { int temp = uglys[indexes[k]] * factors[k]; if(temp < min_v) { min_v = temp; min_index = k; } } indexes[min_index]++; // need to avoid duplicate ugly number if(uglys[uglys.size()-1] != min_v) { uglys.push_back(min_v); } } return uglys[n-1]; }