問題
找到第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,那麼第二個醜數一定是,第三個醜數是,第四個醜數是…
因此,我們只需要記錄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可得最終代碼。