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];

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