【劍指offer】丑數,C++實現


原創博文,轉載請注明出處!
本題牛客網地址

博客文章索引地址

博客文章中代碼的github地址

1. 題目

image

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。

      舉例:

image

思路總結如下:

  • 特殊輸入
    • 由於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 };


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM