LC 求醜數(這個數的確很醜)- 動態規劃

判斷這個數是否是醜數

在這裏插入圖片描述
解題思路
題目中的醜數是隻包含質因數2,3,5的正整數,也就是說如果一個數是醜數的話那麼這個數一定只包含因數2,3,5,因此我們可以將這個數依次除去2,3,5最後判斷這個數是否是被除盡,如果除盡的話那麼這個數就是醜數,返回true,否則返回false

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

求第K個醜數

題目描述在這裏插入圖片描述
思路
定義三個指針idx3,idx5,idx7idx3指向的數字永遠乘3idx5指向的數字永遠乘5idx7指向的數字永遠乘7
初始化所有指針都指向第一個醜數,即1
我們從dp[idx3]*3,dp[idx5]*5,dp[idx7]*7選取最小的一個數字,作爲新的醜數。這邊新的醜數就是3*dp[idx3]=3*1=3,然後idx3++
此時idx5idx7指向第1個醜數,idx3指向第2個醜數。然後重複上一步
這裏基於的一個事實是,醜數數列是遞增的,當idx5指針在當前位置時,後面的數乘以5必然比前面的數乘以5大,所以下一個醜數必然是先考慮前面的數乘以5idx3,idx7同理,所以纔可以使用指針

    int getKthMagicNumber(int k) {
        int idx3 = 0, idx5 =0, idx7 = 0;
        vector<int> dp(k+1, 1);
        for(int i = 1; i <= k; i++)
        {
            dp[i] = min(min(3 * dp[idx3], 5 * dp[idx5]), 7 * dp[idx7]);
            dp[i] == 3 * dp[idx3] ? idx3++ : idx3;
            dp[i] == 5 * dp[idx5] ? idx5++ : idx5;
            dp[i] == 7 * dp[idx7] ? idx7++ : idx7;
        }
        return dp[k-1];
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章