Ugly Number
https://leetcode.com/problems/ugly-number/
如果一个数的因子只有2,3,5那么这个数就是丑数。1默认是,0默认不是。怎么判断一个数是不是丑数,将这个数不断的分解,就可以了。
class Solution {
public:
bool isUgly(int num) {
if(num==1) return true;
if(num==0) return false;
while(num!=1){
if(num%2==0) num/=2;
else if(num%3==0) num/=3;
else if(num%5==0) num/=5;
else return false;
}
return true;
}
};
Ugly Number II
https://leetcode.com/problems/ugly-number-ii/
找第n个丑数,这个还真是不能用原来产生的结果来进行计算了。将丑数序列拆成三个列表:
(1) 1*2,2*2,3*2,4*2……
(2) 1*3,2*3,3*3,4*3……
(3) 1*5,2*5,3*5,4*5……
每次新加入数组的是在这三个列表里选择数字最小的那一个。
class Solution {
public:
int nthUglyNumber(int n) {
if(n==1) return 1;
vector<int> res;
res.push_back(1);
int i2=0,i3=0,i5=0;
while(res.size()<n){
int m2=res[i2]*2;
int m3=res[i3]*3;
int m5=res[i5]*5;
int mn=min(m2,min(m3,m5));
if(mn==m2) i2++;
if(mn==m3) i3++;
if(mn==m5) i5++;
res.push_back(mn);
}
return res.back();
}
};
Super Ugly Number
https://leetcode.com/problems/super-ugly-number/
和前一道题一样,只不过是需要一个数组存储primes的下标。
class Solution {
public:
int nthSuperUglyNumber(int n, vector<int>& primes) {
vector<int> res;
vector<int> index(primes.size(),0);
res.push_back(1);
while(res.size()<n){
int min=INT_MAX,minIndex=0;
for(int i=0;i<index.size();i++){
if(res[index[i]]*primes[i]<min){
min=res[index[i]]*primes[i];
minIndex=i;
}
}
for(int i=0;i<index.size();i++){
if(min==res[index[i]]*primes[i]) index[i]++;
}
res.push_back(min);
}
return res.back();
}
};