丑数

将查找的丑数按从小到大的顺序排好序,注意每个丑数毕为前面的丑数乘以2、3或5得到的;把现有最大丑数记为M,则把第一个乘以2后大于M的结果记为M2,同理,把每个丑数乘以3和5 ,得到的第一个大于M的结果为M3和M5,那么下一个丑数必为M2/M3/M5这三个数的最小者。

辅助空间

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的定义。

 1 class Solution {
 2 public:
 3     int GetUglyNumber_Solution(int index) {
 4         if(index==0) return 0;
 5         if(index==1) return 1;
 6         vector<int> res(index,1);
 7         int t2=0,t3=0,t5=0;
 8         for(int i=1;i<index;i++){
 9             res[i] = min(res[t2]*2,min(res[t3]*3,res[t5]*5));
10             if(res[i]==res[t2]*2) t2++;
11             if(res[i]==res[t3]*3) t3++;
12             if(res[i]==res[t5]*5) t5++;
13         }
14         return res[index-1];
15     }
16 };
原文地址:https://www.cnblogs.com/pacino12134/p/11168471.html