zoukankan      html  css  js  c++  java
  • 【剑指Offer】面试题49. 丑数

    题目

    我们把只包含因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。

    示例:

    输入: n = 10
    输出: 12
    解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。
    

    说明:

    • 1 是丑数。
    • n 不超过1690。

    思路一:暴力(超时)

    依次判断每个数是否是丑数。

    代码

    class Solution {
    public:
        int nthUglyNumber(int n) {
            int cnt = 0, num = 0;
            while (cnt < n) {
                ++num;
                if (isUgly(num)) ++cnt;
            }
            return num;
        }
        // 判断是否是丑数
        bool isUgly(int num) {
            while (num % 2 == 0) num /= 2;
            while (num % 3 == 0) num /= 3;
            while (num % 5 == 0) num /= 5;
            return num == 1 ? true : false;
        }
    };
    

    思路二:三指针

    利用丑数性质:每个丑数是前面某个丑数乘以2或3或5得到的。
    关键在于如何取得下一个丑数,对于已经存在的丑数,存在一个位置i使得,i位置前所有丑数乘以2都在当前已经保存的丑数中,i位置及之后的丑数乘以2还没有保存,同样也分别存在一个位置使得之前所有丑数乘以3(乘以5)都已经在保存的丑数中,其后的丑数还没有保存,我们用i2,i3和i5分别表示这三个位置,那么下一个丑数即为这三个位置丑数分别乘以2,3和5中最小值。每次找到下一个丑数后,更新i2,i3和i5的位置。

    代码

    时间复杂度:O(n)
    空间复杂度:O(n)

    class Solution {
    public:
        int nthUglyNumber(int n) {
            vector<int> num(1691, 0);
            num[0] = 1;
            int i2 = 0, i3 = 0, i5 = 0, next = 1;
            while (next < n) {
                int min = Min(num[i2] * 2, num[i3] * 3, num[i5] * 5);
                num[next] = min;
                while (num[i2] * 2 <= num[next]) ++i2;
                while (num[i3] * 3 <= num[next]) ++i3;
                while (num[i5] * 5 <= num[next]) ++i5;
                ++next;
            }
            return num[next - 1];
        }
    
        int Min(int n1, int n2, int n3) {
            int min = n1 < n2 ? n1 : n2;
            return min < n3 ? min : n3;
        }
    };
    
  • 相关阅读:
    Bug测试报告--在线考试系统--金州勇士
    Bug测试报告--食物链教学工具--奋斗吧兄弟
    Jquery对象和dom对象获取html的方法
    mysql中常见的存储引擎和索引类型
    转:spring MVC HTTP406 Not Acceptable
    Mybatis动态建表
    ssm框架插入mysql数据库中文乱码问题解决
    Maven环境下Poi的使用
    【转】Mybatis传多个参数(三种解决方案)
    【译文】用Spring Cloud和Docker搭建微服务平台
  • 原文地址:https://www.cnblogs.com/galaxy-hao/p/12944281.html
Copyright © 2011-2022 走看看