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 };
  • 相关阅读:
    【MVC 1】MVC+EF实体框架—原理解析
    数据结构导论(一)
    【JavaScript 14—学习总结】:从小事做起
    【JavaScript 13—应用总结】:锁屏遮罩
    【JavaScript 12—应用总结】:弹出登录框
    【JavaScript 11—应用总结】:下拉菜单
    【JavaScript 10—应用总结】:连缀
    【EF 1】EF实体框架 原理+实例
    【多 线 程】
    【命 令 行】
  • 原文地址:https://www.cnblogs.com/pacino12134/p/11168471.html
Copyright © 2011-2022 走看看