LeetCode

来源:互联网 发布:安卓串口助手源码 编辑:程序博客网 时间:2024/05/17 22:10

解题代码:

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

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

0 0