原創博文,轉載請注明出處!
本題牛客網地址
1. 題目
2. 思路
空間換時間的方法。由於題目要求按序查找丑數,可以采用輔助容器vector按序存儲丑數,返回指定位置丑數的策略。用輔助容器vector按序存儲丑數的關鍵在於怎么按序計算丑數。按序計算丑數的方法:設輔助變量t2為一個丑數在vector中的索引,t2位置之前的丑數*2之后小於等於最大丑數,t2位置及t2位置之后的丑數*2后大於最大丑數。設輔助變量t3為一個丑數在vector中的索引,t3位置之前的丑數*3之后小於等於最大丑數,t3位置及t3位置之后的丑數*3后大於最大丑數。設輔助變量t5為一個丑數在vector中的索引,t5位置之前的丑數*5之后小於等於最大丑數,t5位置及t5位置之后的丑數*5后大於最大丑數。min(t2位置的丑數*2,t3位置的丑數*3,t5位置的丑數*5)即為最大丑數p后面的丑數q。
舉例:
思路總結如下:
- 特殊輸入
- 由於1,2,3,4,5,6都是丑數,那么如果index<7時,直接輸出index即
- 輔助空間
- vector:用vector存儲按序生成的丑
- 輔助變量
- t2:t2位置之前的丑數*2之后 ≤ 最大丑數,t2位置的丑數*2之后 > 最大丑數
- t3:t3位置之前的丑數*3之后 ≤ 最大丑數,t3位置的丑數*3之后 > 最大丑數
- t5:t5位置之前的丑數*5之后 ≤ 最大丑數,t5位置的丑數*5之后 > 最大丑
- 按序計算丑數
- 按序計算最大丑數
- 最大丑數 = min(vec[t2]*2,vec[t3]*3,vec[t5]*5)
- 更新三個輔助變量
- 當vec[t2]*2 == 最大丑數時,證明最大丑數 = t2位置的丑數 * 2,不滿足t2的定義。
- 當vec[t3]*3 == 最大丑數時,證明最大丑數 = t3位置的丑數 * 3,不滿足t3的定義。
- 當vec[t5]*5 == 最大丑數時,證明最大丑數 = t5位置的丑數 * 5,不滿足t5的定義。
3. 代碼
1 class Solution { 2 public: 3 int GetUglyNumber_Solution(int index) { 4 5 // 特殊輸入 6 if(index<7) return index; 7 8 // 輔助容器 9 vector<int> res(index); 10 for(int i = 0;i<6;i++) 11 res[i] = i+1; 12 13 // 輔助變量 14 int t2=3; 15 int t3=2; 16 int t5=1; 17 18 // 按序計算丑數 19 for(int i =6;i<index;i++) 20 { 21 res[i] = min(res[t2]*2,min(res[t3]*3,res[t5]*5)); 22 23 if(res[i] == res[t2] * 2 ) t2++; 24 if(res[i] == res[t3] * 3 ) t3++; 25 if(res[i] == res[t5] * 5 ) t5++; 26 } 27 return res[index-1]; 28 } 29 };