• 丑数


    将查找的丑数按从小到大的顺序排好序,注意每个丑数毕为前面的丑数乘以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 };
  • 相关阅读:
    VS Code 使用笔记
    Haskell语言开发工具
    Haskell语言学习笔记(81)Data.Typeable
    Haskell语言学习笔记(80)req
    Haskell语言学习笔记(79)lambda演算
    Haskell语言学习笔记(78)fix
    2733: [HNOI2012]永无乡
    牛课练习赛17
    bzoj3758. 数数
    【BZOJ1786】[Ahoi2008]Pair 配对
  • 原文地址:https://www.cnblogs.com/pacino12134/p/11168471.html
Copyright © 2020-2023  润新知