LeetCode 246 & 313 醜數

問題

找到第n個超級醜數。超級醜數是正數,且它的所有質因數都在給定的質數列表中。
246是313的特殊情況,即指定質因子的個數和值。第一個醜數是1。

輸入: n = 12, primes = [2,7,13,19]
輸出: 32 
解釋: [1,2,4,7,8,13,14,16,19,26,28,32] 是給定大小爲4的質數數組 [2,7,13,19]的前12個醜數序列.

解析

一種最直觀的解法是,暴力枚舉:不管三七二十一,首先醜數列表是[1],然後每個質數都乘上醜數列表裏面的數,得到[1,2,3,5];然後再乘一次得到[1,2,3,5,4,6,10,6,9,15,10,15,25],這樣會得到重複的而且沒有順序的結果,所有需要去重後排序,這樣複雜度太高…
我們換個思路考慮,假設三個質數是2,3,5,那麼第二個醜數一定是num[1]=Min(12,13,15)num[1]=Min(1*2,1*3,1*5),第三個醜數是num[2]=Min(22,13,15)num[2] = Min(2*2,1*3,1*5),第四個醜數是Min(22,23,15)Min(2*2,2*3,1*5)

因此,我們只需要記錄2,3,5分別乘到第幾個醜數位置了。
313超級醜數是進階版,更一般的情況,這時候創建一個數組來保存每個質數乘到第幾個醜數的位置。

Java代碼

    public int nthSuperUglyNumber(int n, int[] primes) {
        int count[] = new int[primes.length];
        int num[] = new int[n];
        num[0]=1;
        int i=1;
        for(;i<n;i++){
            int temp = Integer.MAX_VALUE;
            for(int j=0;j<primes.length;j++){
                temp = Math.min(temp,num[count[j]]*primes[j]);
            }
            num[i] = temp;
            for(int j=0;j<primes.length;j++){
                if(temp==num[count[j]]*primes[j]){
                    count[j]++;
                }
            }
        }
        return num[n-1];
    }

對於246,只需要將primes換成2,3,5可得最終代碼。

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