Leetcode-263&264 丑数Ⅰ&Ⅱ

丑数
只包含质因数 2, 3, 5 的正整数。


263 丑数Ⅰ

循环除以5,3,2这些因子,看最后结果是否为1。

class Solution {
public:
    bool isUgly(int num) {
        if(num<1) return false;
        while(num%5==0)
            num=num/5;
        while(num%3==0)
            num=num/3;
        while(num%2==0)
            num=num/2;
        return num==1;
    }
};

264 丑数Ⅱ
三指针

dp[i]表示第i个丑数(从0开始计数)
因为丑数肯定是一个丑数乘以2,3,5这些因子得到的,关键点在于怎么保证计算出的顺序是满足从小到大的。
使用三指针 p1,p2,p3指向需要倍乘的丑数,保证每一个数丑数都得到倍乘的机会。
如果乘积已经被录取了,就下一个丑数与这个指针代表的倍数相乘。
如果发生了2*3=3*2则两个指针都需要up,因此使用if,而非else if.

class Solution {
public:
    int nthUglyNumber(int n) {
        vector<int> dp(n,1);
        int p1=0,p2=0,p3=0;
        for(int i=1;i<n;i++)
        {
            dp[i]=min(dp[p1]*2,min(dp[p2]*3,dp[p3]*5));
            if(dp[i]==dp[p1]*2)
                p1++;
            if(dp[i]==dp[p2]*3)
                p2++;
            if(dp[i]==dp[p3]*5)
                p3++;
        }
        return dp[n-1];

    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章