LeetCode - 263. Ugly Number & 264. Ugly Number II & 313. Super Ugly Number

解题代码:

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的值使得它们满足能够求出再下一个值。

对于第三题,其实本质跟第二题一样,只是把作为因子的质数的值与数量改变了,因此完全可以按照第二题解法进行求解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值