/**
263 ugly number是一个数的因子是否只包含2,3,5(1被看作是ugly number)
*/
bool isUgly(int num) {
if(num<=0)
return false;
while(num%2==0)
num/=2;
while(num%3==0)
num/=3;
while(num%5==0)
num/=5;
return num==1;
}
/**
264 找到第n个ugly number
For example, 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 is the sequence of the first 10 ugly numbers.
第k个ugly number必定是前面已经形成的ugly number乘以2或3或5,用index[i]来保存使用2,3,5的数目,
那么index[j]指的是我们已经建成的最小的ugly number的索引,所以下一个ugly number = min(res[index[j]]*primes[j]);
*/
int nthUglyNumber(int n) {
vector<int>primes = {2,3,5};
vector<int>index(3,0);
vector<int>res(n,INT_MAX);
res[0] = 1;
for(int i=1;i<n;i++){
for(int j =0;j<3;j++)
res[i] = min(res[i],res[index[j]]*primes[j]);
for(int j=0;j<3;j++)
index[j]+=(res[i]==res[index[j]]*primes[j]);
}
for(int i:res)
cout<<i<<" ";
cout<<endl;
return res[n-1];
}
/**
同上,自己输入primes[];
*/
int nthSuperUglyNumber(int n, vector<int>& primes) {
vector<int>res(n,INT_MAX);
vector<int>index(primes.size(),0);
res[0] = 1;
for(int i=1;i<n;i++){
for(int j=0;j<primes.size();j++)
res[i] = min(res[i],res[index[j]]*primes[j]);
for(int j=0;j<primes.size();j++)
index[j] += (res[i]==res[index[j]]*primes[j]);
}
for(int i:res)
cout<<i<<" ";
cout<<endl;
return res[n-1];
}
LeetCode 263. Ugly Number 264 Ugly Number II 313 Super Ugly Number
最新推荐文章于 2023-12-15 20:26:21 发布