zoukankan      html  css  js  c++  java
  • 丑数

    将查找的丑数按从小到大的顺序排好序,注意每个丑数毕为前面的丑数乘以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 };
  • 相关阅读:
    java 线程 Lock 锁使用Condition实现线程的等待(await)与通知(signal)
    A计划(三维dfs)
    最少拦截系统(线性dp)
    疯狂的采药(完全背包)
    Modular Inverse (拓展欧几里得求逆元)
    斐波那契数列的3种求法及几种素数筛法
    Magic Odd Square (思维+构造)
    Marlin (思维)
    qdu_组队训练(ABCFIJK)
    2018蓝桥编程题6-9+ 50%的10
  • 原文地址:https://www.cnblogs.com/pacino12134/p/11168471.html
Copyright © 2011-2022 走看看