劍指offer:醜數
阿新 • • 發佈:2018-12-09
問題描述:
把只包含質因子2、3和5的數稱作醜數(Ugly Number)。例如6、8都是醜數,但14不是,因為它包含質因子7。 習慣上我們把1當做是第一個醜數。求按從小到大的順序的第N個醜數。
解題思路:
這其實是個數學問題,要用數學的角度去看,設醜數為X,則有公式: ,然後把X從小到大排個序,對X1,X2和 X3 從1到n開始取值,看X1*2,X2*3,X3*5哪個最小,把最小的存入陣列,然後對那個最小的數的係數Xi加1.
正確答案:
class Solution { public://別人的程式碼就是精簡,慚愧啊,繼續學習。 int GetUglyNumber_Solution(int index) { if (index < 7)return index; vector<int> res(index); res[0] = 1; int t2 = 0, t3 = 0, t5 = 0, i; for (i = 1; i < index; ++i) { res[i] = min(res[t2] * 2, min(res[t3] * 3, res[t5] * 5)); if (res[i] == res[t2] * 2)t2++; if (res[i] == res[t3] * 3)t3++; if (res[i] == res[t5] * 5)t5++; } return res[index - 1]; } };
剛開始我是這樣做的,然而發現超時:
public class Solution { public int GetUglyNumber_Solution(int index) { int num = 0; int key = 0; for(int k = 2;; k++){ int i = k; while(i % 2 == 0 ){ i = i / 2; } while(i % 3 == 0){ i = i / 3; } while(i % 5 == 0){ i = i / 5; } if(i == 1) num++; if(num == index) { key = k; break; } } return key; } }