• 【剑指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 };

  • 相关阅读:
    Java MyBatis 插入数据库返回主键
    安卓开发实战之app之版本更新升级(DownloadManager和http下载)完整实现
    js-关于异步原理的理解和总结
    Out of range value for column 'huid' at row
    iOS开发之如何在用户删除应用后保持一些数据
    App开放接口api安全性的设计与实现
    Spring MVC中的拦截器/过滤器HandlerInterceptorAdapter的使用
    input输入框自动获取焦点
    java 静态数组 和非静态数组的区别
    js中引入js
  • 原文地址:https://www.cnblogs.com/wanglei5205/p/8857758.html
Copyright © 2020-2023  润新知