劍指offer------醜數
阿新 • • 發佈:2018-12-12
題目
把只包含因子2、3和5的數稱作醜數(Ugly Number)。例如6、8都是醜數,但14不是,因為它包含因子7。 習慣上我們把1當做是第一個醜數。求按從小到大的順序的第N個醜數。
思路
所謂的一個數m是另一個數n的因子,是指n能被m整除,也就是n%m==0。根據醜數的定義,醜數只能被2、3和5整除。根據醜數的定義,醜數應該是另一個醜數乘以2、3或者5的結果(1除外)。因此我們可以建立一個數組,裡面的數字是排好序的醜數,每一個醜數都是前面的醜數乘以2、3或者5得到的。
這個思路的關鍵問題在於怎樣保證數組裡面的醜數是排好序的。對乘以2而言,肯定存在某一個醜數T2,排在它之前的每一個醜數乘以2得到的結果都會小於已有最大的醜數,在它之後的每一個醜數乘以乘以2得到的結果都會太大。我們只需要記下這個醜數的位置,同時每次生成新的醜數的時候,去更新這個T2。對乘以3和5而言,也存在著同樣的T3和T5。
程式碼:
class Solution { public: int GetUglyNumber_Solution(int index) { if(index < 7){ return index; } vector<int> res(index); for(int i = 0; i < 6; i++){ res[i] = i + 1; } int t2 = 3, t3 = 2, t5 = 1; for(int i = 6; i < index; i++){ res[i] = min(res[t2] * 2, min(res[t3] * 3, res[t5] * 5)); while(res[i] >= res[t2] * 2){ t2++; } while(res[i] >= res[t3] * 3){ t3++; } while(res[i] >= res[t5] * 5){ t5++; } } return res[index - 1]; } };