zoukankan      html  css  js  c++  java
  • 剑指offer33:求按从小到大的顺序的第N个丑数。

    1 题目描述

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

    2 思路和方法

      数值:1  2(1*2)  3(1*3)  4(2*2)   5 (1*5)       6(3*2)  8(4*2)  9(3*3)  10(5*2),……,可见1以后的丑数都是前面的丑数乘以2、3或者5。

      因为丑数只包含质因子2,3,5,假设我们已经有n-1个丑数,按照顺序排列,且第n-1的丑数为M。那么第n个丑数一定是由这n-1个丑数分别乘以2,3,5,得到的所有大于M的结果中,最小的那个数

      newNum = min(arr[p2] * 2, min(arr[p3] * 3, arr[p5] * 5));  if(arr[p2] * 2 == newNum) p2++;

      存在某个最小值T2(<M,而arr[p2] * 2=T2,同理,也存在这样的数T3T5,我们只需要标记这三个数即可。

    3 C++核心代码

     1 class Solution {
     2 public:
     3     int GetUglyNumber_Solution(int index) {
     4         // 0-6的丑数分别为0-6
     5         if(index < 7) return index;
     6         //p2,p3,p5分别为三个队列的指针,newNum为从队列头选出来的最小数
     7         int p2 = 0, p3 = 0, p5 = 0, newNum = 1;
     8         vector<int> arr;
     9         arr.push_back(newNum);
    10         while(arr.size() < index) {
    11             //选出三个队列头最小的数
    12             newNum = min(arr[p2] * 2, min(arr[p3] * 3, arr[p5] * 5));
    13             //这三个if有可能进入一个或者多个,进入多个是三个队列头最小的数有多个的情况
    14             if(arr[p2] * 2 == newNum) p2++;
    15             if(arr[p3] * 3 == newNum) p3++;
    16             if(arr[p5] * 5 == newNum) p5++;
    17             arr.push_back(newNum);
    18         }
    19         return newNum;
    20     }
    21 };
    View Code

    参考资料

    https://blog.csdn.net/Fly_as_tadpole/article/details/82705774

  • 相关阅读:
    使用EF进行简单的增删改查
    观察者模式(委托事件的小应用)
    lambda表达式和表达式树
    socket知识总结
    xml读写Demo
    winfrom DataGridView Demo
    6月26号.NET面试题(程序题部分)只要做懂这3道题肯定能脱离菜鸟称号!
    多线程与异步编程知识简单总结
    15年6月14号面试中没有回答出来的问题
    2020.5.15记一次阿里电话面试经历
  • 原文地址:https://www.cnblogs.com/wxwhnu/p/11420832.html
Copyright © 2011-2022 走看看