Design an algorithm to find the kth number such that the only prime factors are 3, 5, and 7.
The eligible numbers are like 3, 5, 7, 9, 15 ...
Example
If k=4, return 9.
Challenge
O(n log n) or O(n) time
Analysis:
This is the Humble number problem (醜數問題). Search the Humble Number problem online.
分析:假設陣列ugly[N]中存放不斷產生的醜數,初始只有一個醜數ugly[0]=1,由此出發,下一個醜數由因子2,3,5競爭產生,得到 ugly[0]*2, ugly[0]*3, ugly[0]*5, 顯然最小的那個數是新的醜數,所以第2個醜數為ugly[1]=2,開始新一輪的競爭,由於上一輪競爭中,因子2獲勝,這時因子2應該乘以ugly[1] 才顯得公平,得到ugly[1]*2,ugly[0]*3,ugly[0]*5, 因子3獲勝,ugly[2]=3,同理,下次競爭時因子3應該乘以ugly[1],即:ugly[1]*2, ugly[1]*3, ugly[0]*5, 因子5獲勝,得到ugly[3]=5,重複這個過程,直到第n個醜數產生。總之:每次競爭中有一個(也可能是兩個)因子勝出,下一次競爭中 勝出的因子就 應該加大懲罰!
注意這裡不可以使用if/else 迴圈,因為有可能多於一個指標的結果是相等的:例如p3->5, p5->3, 他們的結果相等,這是兩個指標都要+1
Solution:
1 class Solution { 2 /** 3 * @param k: The number k. 4 * @return: The kth prime number as description. 5 */ 6 public long kthPrimeNumber(int k) { 7 if (k==0) return 1; 8 9 long[] res = new long[k+1]; 10 res[0] = 1; 11 int p3 = 0, p5 = 0, p7 = 0; 12 for (int i=1;i<=k;i++){ 13 //find the minimum prime number. 14 long val = Math.min(res[p3]*3, res[p5]*5); 15 val = Math.min(val, res[p7]*7); 16 if (val / res[p3] == 3) p3++; 17 if (val / res[p5] == 5) p5++; 18 if (val / res[p7] == 7) p7++; 19 res[i] = val; 20 } 21 return res[k]; 22 } 23 };