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

原文地址:https://www.cnblogs.com/wanglei5205/p/8857758.html