解题代码:
263. Ugly Number:
class Solution {
public:
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;
if(num==1)
return true;
else
return false;
}
};
264. Ugly NumberII:
class Solution {
public:
int nthUglyNumber(int n) {
vector<int> res(n);
res[0]=1;
int a=0,b=0,c=0;
for(int i=1;i<n;i++){
res[i]=min(min(res[a]*2,res[b]*3),res[c]*5);
while(res[a]*2<=res[i]){
a++;
}
while(res[b]*3<=res[i]){
b++;
}
while(res[c]*5<=res[i]){
c++;
}
}
return res[n-1];
}
};
313. Super UglyNumber:
class Solution {
public:
int nthSuperUglyNumber(int n,vector<int>& primes) {
vector<int> res(n);
res[0]=1;
vector<int> num(primes.size(),0);
for(int i=1;i<n;i++){
res[i]=INT_MAX;
for(intj=0;j<primes.size();j++){
res[i]=min(res[num[j]]*primes[j],res[i]);
}
for(intj=0;j<primes.size();j++){
while(res[num[j]]*primes[j]<=res[i]){
num[j]++;
}
}
}
return res[n-1];
}
};
解题思路:
这几题都是要找ugly number,因此放在一起。
对于第一题,只需要判断出数字是否ugly number,因此比较简单,只需看所给数字是否只能被2,3,5整除即可。
对于第二题,要找出第n个ugly number,设L[i]为第i个ugly number。这里需要考虑到,对于第i个ugly number(i大于1),它必然等于前面某一个ugly number乘以2,3或5,因此我们分别设三个数a,b,c使得下一个数等于L[a]*2,L[b]*3或 L[c]*5,显然,只能等于它们三个中间最小的一个,并且此时需要更新a,b,c的值使得它们满足能够求出再下一个值。
对于第三题,其实本质跟第二题一样,只是把作为因子的质数的值与数量改变了,因此完全可以按照第二题解法进行求解。