原创博文,转载请注明出处!
本题牛客网地址

博客文章索引地址

博客文章中代码的github地址

1. 题目

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。

举例:

思路总结如下:

  • 特殊输入
    • 由于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 };


【剑指offer】丑数,C++实现的更多相关文章

  1. 剑指Offer——丑数

    剑指Offer--丑数 前言     参照<剑指Offer>,通过洞悉其思想并消化吸收,改为java实现,供自己以后巩固. package cn.edu.ujn.offersword; i ...

  2. 剑指Offer丑数问题

    这是剑指第一次卡死我的题……记录一下 首先看题目: 把只包含质因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含质因子7. 习惯上我们把1当做是第一个丑数 ...

  3. 剑指offer 丑数

    思路:可以发现,每个丑数都是由以前的丑数得到.当前丑数一定是之前丑数能够得到的最小丑数. AC代码 class Solution { public: int GetUglyNumber_Solutio ...

  4. 用js刷剑指offer(丑数)

    题目描述 把只包含质因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含质因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 思路 ...

  5. 剑指offer——丑数(c++)

    题目描述只包含质因子2.3和5的数称作丑数(UglyNumber).例如6.8都是丑数,但14不是,因为它包含质因子7,习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 思路:1.逐个 ...

  6. 剑指offer--33.丑数

    本来用数组做标志位,但是测试数据有第1500个,859963392,惹不起哦 ------------------------------------------------------------- ...

  7. 剑指Offer-32.丑数(C++/Java)

    题目: 把只包含质因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含质因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 分析: ...

  8. 剑指Offer32 丑数

    /************************************************************************* > File Name: 32_UglyNu ...

  9. 干货 | 剑指offer系列文章汇总

    下面是名企面试中经常会出现的面试题目,大家可以戳相应的题目查看题目细节,其答案会在紧接着的后一篇中出现  剑指offer系列  始 剑指offer—灯管问题(1)  剑指offer—10人电梯(2)  ...

  10. 【剑指offer】丑数

    把只包含因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. leetcode上也 ...

随机推荐

  1. LeetCode——Longest Repeating Character Replacement

    1. Question Given a string that consists of only uppercase English letters, you can replace any lett ...

  2. jquery实现全选/全不选

    //设置全选全不选$("#checkAll").click(function () { if ($("#checkAll").attr("checke ...

  3. 转载:Service Mesh:重塑微服务市场--敖小剑

    转载地址:https://skyao.io/talk/201805-service-mesh-rebuild-microservice-market/ 重点: 不要太过关注  Service Mesh ...

  4. MapReduce-实践2

    进阶实践4:  mapper,reducer输出数据压缩 应用场景 当mapper或者reducer的输出数量比较大,会影响shuffle阶段远程拷贝的网络性能,以及对存储容量的要求:这个时候可以考虑 ...

  5. hiho 1318 非法二进制数 dp

    #1318 : 非法二进制数 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 如果一个二进制数包含连续的两个1,我们就称这个二进制数是非法的. 小Hi想知道在所有 n 位 ...

  6. CSS之按钮过滤

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  7. Kafka分布式:ZooKeeper扩展

    [ZooKeeper] 服务注册.服务发现.客户端负载均衡.Offset偏移量分布式存储. kafka使用zookeeper来实现动态的集群扩展,不需要更改客户端(producer和consumer) ...

  8. 自学数据库建模工具--powerdesigner

    网上找了个英文的,版本感觉有点旧12的,但还好英语还行,摸索了一下功能,大概截了几张图,感觉优点:1总共有物理模型pdm,概念模型cdm,业务模型bdm 可以互转,逻辑清晰   2表与表之前的联系,建 ...

  9. S.O.L.I.D 是面向对象设计(OOD)和面向对象编程(OOP)中的几个重要编码原则

    注:以下图片均来自<如何向妻子解释OOD>译文链接:http://www.cnblogs.com/niyw/archive/2011/01/25/1940603.html      < ...

  10. Mysql5.7基于日志转为基于事务主从复制

    将基于日志的复制变更为基于事务的复制 mysql版本要高于5.7.6 gtid_mode要设为off 处理步骤 详细步骤 1.查看主从mysql版本是否高于5.7.6 show variables l ...